一口气分解出许多变异变量
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)
如果我已经重新编码了 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)