我有一个类似以下简化数据集的数据集:

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相关问答推荐

有没有方法将paste 0功能与列表结合起来?

使用R中的gt对R中的html rmarkdown文件进行条件格式设置表的单元格

如何将移除事件分配给动态创建的按钮?

bslib::card_header中的shine::downloadButton,图标而不是文本

从BRM预测价值

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

如何通过ggplot2添加短轴和删除长轴?

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

跨列查找多个时间报告

根据列表中项目的名称合并数据框和列表

基于数据集属性将科分配给物种

在R中,如何将误差条放置在堆叠的每个条上?

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

用多边形替换地块点

Ggplot2如何找到存储在对象中的残差和拟合值?

整理ggmosaic图的标签

R:使用ApexCharge更改标签在饼图中的位置

R/shiny APP:如何充分利用窗口?

组合名称具有模式的列表的元素

如何使用list_rind在列表中保留已命名但不包含第0行的记录?