我有两个数据帧需要在R中合并.在合并之前我不能真正修改它们,它们共享许多列,但在复制的列中没有重叠的值,如果一列中的一行有值,则复制的列中的同一行是NA.合并后,我的代码如下所示:

df1 <- data.frame(id = c(1,2,3,4),
                  Var1 = c(1,2,NA,NA),
                  Var2 = c("a","b",NA,NA))

df2 <- data.frame(id = c(1,2,3,4),
                  Var1 = c(NA,NA,3,4),
                  Var2 = c(NA,NA,"c","d"))

mergedData <- merge(df1, df2, by = "id")

mergedData <- mergedData[, c("Var1.x", "Var1.y", "Var2.x", "Var2.y")]

print(mergedData)
  Var1.x Var1.y Var2.x Var2.y
1      1     NA      a   <NA>
2      2     NA      b   <NA>
3     NA      3   <NA>      c
4     NA      4   <NA>      d

我编写了一个在其他脚本中使用的函数,该函数合并两列,然后删除其中一列:

mergeColumns <- function(df, colToRemove, colToKeep) {
  df[[colToKeep]][is.na(df[[colToKeep]])] <- df[[colToRemove]][is.na(df[[colToKeep]])]
  df[[colToRemove]] <- NULL
  names(df)[names(df) %in% colToKeep] <- gsub(".x|.y", "", names(df)[names(df) %in% colToKeep])
  return(df)
}

在处理单列时,这种方法工作得很好(尽管我确信有一种更干净的方法).然而,在我合并的数据帧中,我有许多列需要合并.我不确定做这件事的最好方法.我想过创建一个需要合并的列的数据帧,并try 使用Apply函数系列,但没有成功(我知道下面的方法不太可能奏效,但我认为它可能会让我朝着正确的方向前进):

duplicatedColumns <- data.frame(colstoKeep = c("Var1.x", "Var2.x'"),
                                coltoRemove = c("Var1.y", "Var2.y"))

lapply(data, mergeColumns(duplicatedColumns$sampleIntakeCols, duplicatedColumns$rnaMetadataCols))
>Error in match.fun(FUN) : argument "FUN" is missing, with no default

任何关于我如何才能让这件事变得更好的洞察力都将不胜感激.R垒更可取.先谢谢你.

推荐答案

考虑到您需要递归地修改数据帧,我只需要使用一个很好的老式循环.您还可以使用grep()来标识列.

colstoKeep <- grep("\\.x$", names(mergedData), value = TRUE)
colstoRemove <- grep("\\.y$", names(mergedData), value = TRUE)

for (i in seq_along(colstoKeep)) {
  mergedData <- mergeColumns(mergedData, colstoKeep[[i]], colstoRemove[[i]])
}
mergedData
  Var1 Var2
1    1    a
2    2    b
3    1    c
4    2    d

R相关问答推荐

根据收件箱中的特定值提取列名

如何删除R中除某些特定名称外的所有字符串?

R:更新后无法运行控制台

如何在kableextra调用cell_spec()中忽略NA?

如何写一个R函数来旋转最后n分钟?

如何在modelsummary中重命名统计数据?

如何在geom_col中反转条

多个过滤器内的一个盒子在仪表板Quarto

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

使用带有OR条件的grepl过滤字符串

解析R函数中的变量时出现的问题

如何在R中通过多个变量创建交叉表?

我正在try 创建一个接近cos(X)的值的While循环,以便它在-或+1-E10范围内

使用LAG和dplyr执行计算,以便按行和按组迭代

如何将图例文本添加到图例符号中

重写时间间隔模糊连接以减少内存消耗

如何创建一个由一个连续变量和一个因素变量组成的复杂方框图?

随机生成样本,同时在R内的随机样本中至少包含一次所有值

我怎么才能把一盘棋变成一盘棋呢?

从单个html段落中提取键-值对