【发布时间】:2021-04-28 01:51:19
【问题描述】:
我将从一些示例数据开始:
set.seed(1)
exampledata <- data.frame(
a = sample(1:5, 10, replace = TRUE),
b = sample(1:5, 10, replace = TRUE),
c = sample(1:5, 10, replace = TRUE),
a_long = sample(1:5, 10, replace = TRUE),
b_long = sample(1:5, 10, replace = TRUE),
c_long = sample(1:5, 10, replace = TRUE)
)
当满足原始列的条件时,我正在尝试将列 a 到 c 中的值替换为相应 _long 列中的重新编码值。这完成了我想要的但不能很好地扩展:
library(tidyverse)
library(sjmisc)
exampledata %>%
mutate(
a = case_when(
a %% 2 == 1 ~ rec(a_long, rec = "1=4000; 2=12000; 3=20000; 4=30000; 5=42000"),
TRUE ~ as.numeric(a)
),
b = case_when(
b %% 2 == 1 ~ rec(b_long, rec = "1=4000; 2=12000; 3=20000; 4=30000; 5=42000"),
TRUE ~ as.numeric(b)
),
c = case_when(
c %% 2 == 1 ~ rec(c_long, rec = "1=4000; 2=12000; 3=20000; 4=30000; 5=42000"),
TRUE ~ as.numeric(c)
)
)
这是我一次对所有列执行此操作的尝试:
exampledata %>%
mutate(across(c(a, b, c), ~ case_when(
.x %% 2 == 1 ~ rec(paste0(cur_column(), "_long"), rec = "1=4000; 2=12000; 3=20000; 4=30000; 5=42000"),
TRUE ~ as.numeric(.x)
)))
但是,它不使用重新编码的值,而是将NA's 放在满足条件的单元格中。我尝试在paste0(cur_column(), "_long") 之前添加!! 但这会引发错误:
错误:
cur_column()只能在across()内部使用。
我的问题本质上是如何将列名粘贴在一起,以便我可以将它们输入rec()。
我会参考继续使用rec() 和case_when(),因为我的真实代码使用多个条件并且有更多值需要重新编码。任何帮助将不胜感激。
【问题讨论】: