一口气分解出许多变异变量

factor many mutated variables in one fell swoop

如果我已经重新编码了 20 个变量,为什么我不能将 mutate() 导入 as_factor()?我没有收到错误,但它只是没有进行任何调平。

我可以一个一个做 df$Ethnicity %<>% as_factor()

但我做不到:

df %<>% 
     mutate(
      Gender = case_when(
      Q4 == 1 ~ "Male", 
      Q4 == 2 ~ "Female",
      TRUE ~ as.character("Other")),

      Education = case_when(
        Education_n %in% c(1:4) ~ "Low", 
        Education_n %in% c(5:8) ~ "Medium", 
        Education_n %in% c(9:11) ~ "High", 
        TRUE ~ NA_character_)) %>% 
as_factor()

我也试过了as_factor(.),没用。我真的必须在 factor() 中手动包装每个 case_when 吗?我有二十个变量,我想避免需要将每个变量都写成 purr:: 函数或重复包装因子()二十次的解决方案。

如果您不想将每列转换为因子,您可以使用 across 将列范围转换为因子。

df %<>% 
   mutate(
     Gender = case_when(
            Q4 == 1 ~ "Male", 
            Q4 == 2 ~ "Female",
            TRUE ~ as.character("Other")),

     Education = case_when(
        Education_n %in% c(1:4) ~ "Low", 
        Education_n %in% c(5:8) ~ "Medium", 
        Education_n %in% c(9:11) ~ "High", 
        TRUE ~ NA_character_)) %>%
    mutate(across(Gender:Education, as_factor))

如果您有旧版本的 dplyr 使用 mutate_at :

mutate_at(vars(Gender:Education), as_factor)

为了回答您的问题,forcats::as_factor() 没有数据框方法,所以如果您没有看到错误,它实际上是在使用 haven::as_factor()。在这种情况下,数据框方法默认设计为仅应用于 class labelled 的变量(例如,通常是从其他统计软件导入的数据)。如果您想将 as_factor() 应用于数据框中的 所有变量 而不管它们是否 labelled class 您可以使用 only_labelled 争论。但这可能不是您真正想要的,因为 1) 所有变量都将转换为因子,并且 2) 因子水平顺序可能不是您所期望的。但举个例子:

library(haven)
library(dplyr)

df %<>% 
     mutate(
      Gender = case_when(
      Q4 == 1 ~ "Male", 
      Q4 == 2 ~ "Female",
      TRUE ~ as.character("Other")),

      Education = case_when(
        Education_n %in% c(1:4) ~ "Low", 
        Education_n %in% c(5:8) ~ "Medium", 
        Education_n %in% c(9:11) ~ "High", 
        TRUE ~ NA_character_)) %>% 
     as_factor(only_labelled = FALSE)