我正在尝试使用因子水平的“密码本”(格式化为命名列表的列表)将大量数字变量转换为因子变量。我可以使用mutate()recode_factor()一件一件地做,但是我想用mutate_at()一件一件地做。我该怎么办?

codebook <- list(
  vs = list(`0` = 'V-shaped',
            `1` = 'straight'),
  am = list(`0` = 'automatic',
            `1` = 'manual')
)

mtcars %>%
  mutate(vs = recode_factor(vs, levels = !!!(pluck(codebook, 'vs'))))

mtcars %>%
  mutate_at(vars(names(codebook)),
            funs(recode_factor(., levels = !!!(pluck(codebook, 'somehow_pass_column_name_here?')))))

最佳答案

一种选择是遍历“密码本”的names

library(tidyverse)
names(codebook) %>%
   map(~ mtcars %>%
           transmute(!! .x := recode_factor(!! rlang::sym(.x),
                        levels  = !!!(pluck(codebook, .x))))) %>%
   bind_cols(mtcars %>%
   select(-one_of(names(codebook))), .)

或使用for循环
library(magrittr)
for(nm in names(codebook)) {
  mtcars %<>%
        mutate(!! nm := recode_factor(!! rlang::sym(nm),
               levels = !!!(pluck(codebook, nm))))
}

关于r - 如何使用dplyr将变量从数字转换为具有唯一级别的因子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51565208/

10-12 22:30