一举多得

问题描述 投票:0回答: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都手动地包在 factor()? 我有20个变量,我想避免需要把每个变量写成purr::函数或者重复包装factor()20次的解决方案。

r mutate r-factor forcats
1个回答
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))

如果你有一个旧版本的 dplyr 使用 mutate_at :

mutate_at(vars(Gender:Education), as_factor)

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)
© www.soinside.com 2019 - 2024. All rights reserved.