问题描述
我试图在 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
解决方法
问题在于,您实际上是在此处更改了两个新列,因此您将在结果数据框中看到有两列 gmail
和 b2_1
,每列对应于应用这两个函数。
如果您运行 b2_2
,您将看到您想要的输出。
如果您的目标是先删除然后重新排序,那么您需要运行连续的变异:
levels(df$b2_2)
或在您的 mutate 中运行嵌套函数
df <- df %>%
mutate(across(where(is.factor),fct_drop)) %>%
mutate(across(where(is.factor),fct_infreq))