我正在尝试使用因子水平的“密码本”(格式化为命名列表的列表)将大量数字变量转换为因子变量。我可以使用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/