我有一个类似于以下简化数据集的数据集:
x_1 <- c(1, NA, 2, 3, NA, 4, 5)
x_2 <- c(2, 1, NA, NA, NA, 4, 6)
y_1 <- c(2, 4, 6, 8, NA, 10, NA)
y_2 <- c(NA, 4, NA, 8, 10, 11, 13)
df <- data.frame(x_1, x_2, y_1, y_2)
x_1 x_2 y_1 y_2
1 1 2 2 NA
2 NA 1 4 4
3 2 NA 6 NA
4 3 NA 8 8
5 NA NA NA 10
6 4 4 10 11
7 5 6 NA 13
目标是合并两个相应变量(x 和 y),并用 NA 替换不相同的值(例如 x_1 和 x_2 的第一行)。我通过以下方式做到了这一点:
df <- df %>%
mutate(x = coalesce(x_1, x_2)) %>%
mutate(x = ifelse(!is.na(x) &
!is.na(x_2) &
x != x_2,
NA,
x)) %>%
select(!c(x_1, x_2))
现在,我必须使用 21 个变量来执行此操作,因此我想将变量放入列表中,并使用如下 for 循环将它们通过管道提供:
cols <- c("x", "y")
for(i in cols){
var_1 <- paste(i, "1", sep = "_")
var_2 <- paste(i, "2", sep = "_")
df <- df %>%
mutate(i = coalesce(var_1, var_2)) %>%
mutate(i = ifelse(!is.na(i) &
!is.na(var_2) &
i != var_2,
NA,
i)) %>%
select(!c(var_1, var_2))
}
所发生的情况是代码被执行,但没有新变量,只有带有空值的变量“i”。似乎 R 无法将管道中的“i”识别为迭代器,但它确实识别“var_1”和“var_2”(因为它们正在从数据集中删除)。
有谁知道这是为什么以及如何解决它?
提前非常感谢。
最佳答案
fun <- function(x, var) {
var_1 <- sym(paste(var, "1", sep = "_"))
var_2 <- sym(paste(var, "2", sep = "_"))
x %>%
mutate(!!var := ifelse((!!var_1 != !!var_2) %in% TRUE,
NA, coalesce(!!var_1, !!var_2))) %>%
select(!c(var_1, var_2))
}
cols <- c("x", "y")
Reduce(fun, cols, init = df)
# x y
# 1 NA 2
# 2 1 4
# 3 2 6
# 4 3 8
# 5 NA 10
# 6 4 NA
# 7 NA 13
关于r - 在 R 中使用 for 循环在管道上迭代变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73771029/