将 mutate 与多个函数一起使用

问题描述

我试图在 mutate(across(where(is.factor))) 中提供两个函数来对因子级别进行排序并删除未使用的级别。代码似乎没有按预期工作。可能哪里出错了?

#---- Libraries ----

library(tidyverse)

#---- Data ----

set.seed(2021)

df <- tibble(
  a1 = factor(ifelse(sign(rnorm(30))==-1,1),labels = c("No","Yes")),a2 = factor(ifelse(sign(rnorm(30))==-1,gender = gl(2,15,labels = c("Males","Females")),b2 = gl(3,10,labels = c("Primary","Secondary","Tertiary","Unknown")),c1 = gl(3,labels = c("15-19","20-24","25-30","30-35")),outcome = factor(ifelse(sign(rnorm(30))==-1,weight = runif(30,1,12)
)

#---- Problem ----

df <- df %>%
  mutate(across(where(is.factor),list(fct_infreq,fct_drop)))

levels(df$b2)

# The unused levels not dropped

解决方法

问题在于,您实际上是在此处更改了两个新列,因此您将在结果数据框中看到有两列 gmailb2_1,每列对应于应用这两个函数。

如果您运行 b2_2,您将看到您想要的输出。

如果您的目标是先删除然后重新排序,那么您需要运行连续的变异:

levels(df$b2_2)

或在您的 mutate 中运行嵌套函数

df <- df %>%
  mutate(across(where(is.factor),fct_drop)) %>% 
  mutate(across(where(is.factor),fct_infreq)) 
  

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...