1

如果我已经重新编码了 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(.) ,但无济于事。我真的必须手动包装每个 case_when infactor()吗?我有二十个变量,我想避免需要将每个变量写入 purr:: 函数或重复 wrapping factor() 二十次的解决方案。

4

2 回答 2

1

如果您不想将每列转换为因子,则可以使用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))

如果您有旧版本的dplyruse mutate_at

mutate_at(vars(Gender:Education), as_factor)
于 2020-06-03T00:37:02.067 回答
0

要回答您的问题,forcats::as_factor()没有数据框方法,因此如果您没有看到错误,它实际上是在使用haven::as_factor(). 在这种情况下,数据框方法默认设计为仅适用于同类变量labelled(例如,通常是从其他统计软件导入的数据)。如果要应用于数据框中as_factor()所有变量,无论它们是否是labelled类,都可以使用该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)
于 2020-06-03T01:05:14.923 回答