r - 从 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 部分工作?
解决方案
我们可以用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_)))
推荐阅读
- ios - 打开另一个带有标签栏和导航栏的故事板
- html - figcaption 不算作图形内的空间吗?
- c - macOS 上的 Clang 无法从 ncurses 链接 lmenu
- scala - 使用 State 和 IO 的堆叠单子时停止理解中流
- python - if语句和日期时间模块python
- oracle - 我在将 DUMP 文件中的表导入 Oracle 数据库时遇到问题
- reactjs - 在 React 中的 li 的 onClick 上加载不同的详细信息
- asp.net - ASP .NET 将其更改为默认视图
- websocket - 如何从 WebSocket(协议缓冲区)查看二进制数据
- laravel - GroupBy 和 mapToGroups 返回 API 资源中的对象