如果我有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都手动地包在 factor()
? 我有20个变量,我想避免需要把每个变量写成purr::函数或者重复包装factor()20次的解决方案。
如果你不想把每一列都转换为因子,你可以使用 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()
. 在这种情况下,数据框架方法默认被设计为只应用于类为 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)