如何使用dplyr编写循环以突变多个列

  • 本文关键字:突变 循环 何使用 dplyr r
  • 更新时间 :
  • 英文 :


我有一个数据帧,我想在其中:(1(备份原始列;(2( 重新编码等于1的列值;以及(3(仅针对指定列而不是整个数据帧来替换NA值。

我的完整数据集有十几个类似格式的列。

q1_1 = c(1, 1, 1, NA, 0)
q1_2 = c(2, 2, 2, NA, 0)
df <- data.frame(q1_1, q1_2)
for (i in 1:2) {
df <- df %>% 
mutate(paste0("q1_", i, "_backup") = paste0("q1_", i),
paste0("q1_new", i) = recode(paste0("q1_", i),
`i` = 1),
paste0("q1_new", i) = replace_na(paste0("q1_", i), 0
))
}

我尝试编写for循环,但收到一条错误消息,不知道如何诊断代码。

> Error: unexpected '=' in: " df <- df %>% mutate(paste0("q1_", i, "backup") ="
> Error: Error: unexpected ',' in: " paste0("q1_new", i) = recode(paste0("q1_", i),  `i` = 1),"
> Error: unexpected ')' in: "           paste0("q1_new", i) = replace_na(paste0("q1_", i), 0 ))"
> Error: unexpected '}' in "}"

结果应该是这样的:

q1_1 = c(1, 1, 1, NA, 0)
q1_1_new = c(1, 1, 1, 0, 0)
q1_1_backup = c(1, 1, 1, NA, 0)
q1_2 = c(2, 2, 2, NA, 0)
q1_2_new = c(1, 1, 1, 0, 0)
q1_2_backup = c(2, 2, 2, NA, 0)
df <- data.frame(q1_1, q1_1_new, q1_1_backup, q1_2, q1_2_new, q1_2_backup)

当您想以相同的方式对多个列进行变异时,答案是across(),而不是循环。我在将你的代码/描述与你想要的输出相匹配时遇到了问题,所以这里有一个(几乎(与你想要输出相匹配的小例子。不同的是,我使用原始列名保留了原始数据,并将_edited添加到修改后的值中——这样做更容易。

df %>%
mutate(across(everything(), 
~ coalesce(as.integer(.x > 0), 0),
.names = "{.col}_new"
)) %>%
mutate(across(!contains("new"), I, .names = "{.col}_backup"))
#   q1_1 q1_2 q1_1_new q1_2_new q1_1_backup q1_2_backup
# 1    1    2        1        1           1           2
# 2    1    2        1        1           1           2
# 3    1    2        1        1           1           2
# 4   NA   NA        0        0          NA          NA
# 5    0    0        0        0           0           0

您可以看到新名称是如何定义的,其中{.col}是原始列名。

如果你想了解更多关于across()的信息,那么这本冷色小插曲是一本不错的读物。

最新更新