首页 > 解决方案 > 从 mutate_at 到 mutate(across(, 还有 .names

问题描述

我正在将调查响应(字符)重新编码为一组问题(不在连续列中),我很高兴能够让以下代码正常工作:

#make a list of the selected columns


fcols <- c(2, 6, 8, 9, 14)

#recode the selected columns

d <- d %>% mutate_at(vars(fcols),
    ~(recode(.,
           "OriginalResponse1" = "NewResponse1",
           "OriginalResponse2" = "NewResponse2",
           "OriginalResponse3" = "NewResponse3",
           "OriginalResponse4" = "NewResponse4",
           .default = NA_character_)))

我的主要问题与使用“across”进行这项工作有关,因为“mutate_at”显然已被取代。

我尝试了以下 - 放入“交叉”,并确保在最后添加一个新的封闭括号 - 但它不起作用:

d <- d %>% mutate(across(vars(fcols),
    ~(recode(.,
           "OriginalResponse1" = "NewResponse1",
           "OriginalResponse2" = "NewResponse2",
           "OriginalResponse3" = "NewResponse3",
           "OriginalResponse4" = "NewResponse4",
           .default = NA_character_))))

Error: Problem with `mutate()` input `..1`.
x Must subset columns with a valid subscript vector.
x Subscript has the wrong type `quosures`.
i It must be numeric or character.
i Input `..1` is `across(...)`.

此外,我一直在尝试在 .default 参数之后使用 .names 参数创建一组新的列(而不仅仅是更改现有的列),但我无法让它工作,除了一次仅部分 - 当列出现但它们都是空的。

主要问题:在将其从工作“mutate_at”版本转换为“对面”时我缺少什么?

奖励:我如何让 .names 部分工作?

标签: rdplyr

解决方案


我们可以用all_of代替来包装vars。另外,recode可以取一个名字vector

library(dplyr)
library(stringr)
nm1 <- setNames(str_c("NewResponse", 1:4), 
           str_c("OriginalResponse", 1:4))
d %>% 
mutate(across(all_of(fcols),
                    ~recode(., !!! nm1,
                             .default = NA_character_)))

推荐阅读