我有几个数据集是长到宽转换的结果.示例数据:

data1 <- data.frame(
                   x1 = c(1, NA, NA, NA, NA, NA),          # Create example data frame
                   x2 = c(NA, 1, NA, NA, NA, NA),
                   x3 = c(NA, NA, NA, 1, 1, NA),
                   y = 11:16,
                   z = 6:1)

data2 <- data.frame(
                   x1 = c(NA, NA, 2, 2, NA, NA),          # Create example data frame
                   x2 = c(NA, NA, NA, NA, 2, NA),
                   x4 = c(NA, NA, NA, NA, NA, 2),
                   y = 11:16,
                   z = 6:1)
               
data3 <- data.frame(
                    x2 = c(3, NA, 3, NA, NA, NA),          # Create example data frame
                    x3 = c(NA, 3, NA, NA, NA, NA),
                    x5 = c(NA, NA, NA, NA, 3, 3),
                    y = 11:16,
                    z = 6:1)

  • 所有数据集的行数相同.
  • 有些列在所有数据集中是相同的,如示例中的y和z.
  • 其他列仅存在于某些数据集中.有些发现在 多个数据集(这里为x1、x2和x3),其他数据集只能找到 一次(如x4和x5).这些列有许多NA和一些有效 数值.

我想合并数据集,获得以下内容:

 datafull
  x1 x2 x3 x4 x5  y z
1  1  3 NA NA NA 11 6
2 NA  1  3 NA NA 12 5
3  2  3 NA NA NA 13 4
4  2 NA  1 NA NA 14 3
5 NA  2  1 NA  3 15 2
6 NA NA NA  2  3 16 1

所有列都应该存在,并且任何数据集中存在的任何有效值都应该包含在专用列中,以替换其他数据集中的NA(例如,看看X1和X2的情况.

我try 与

datasetlist <- list(data1, data2, data3)
datafull <- Reduce(function(x, y) merge(x, y, all.y=TRUE), datasetlist)  

但我得到的是

datafull
  x2  y z x3 x1 x4 x5
1  3 11 6 NA NA NA NA
2  3 13 4 NA NA NA NA
3 NA 12 5  3 NA NA NA
4 NA 14 3 NA  2 NA NA
5 NA 15 2 NA NA NA  3
6 NA 16 1 NA NA  2  3

似乎在Reduce完成的迭代合并中,新数据集的值完全取代了旧值,即使新值是NA.

有办法避免这种情况吗?

推荐答案

写一个函数来完成同样的任务

patch_all <- function(x){
  if (is.data.frame(x)) return(x)
  nms_x <- names(x[[1]])
  if (length(x) == 1 & is.data.frame(x[[1]]))
    return(x[[1]][, order(nms_x)])
  nms_y <- names(x[[2]])
  nms_all <- intersect(nms_x, nms_y)
  x[[2]] <- tibble::rowid_to_column(x[[1]][nms_all])|>
    dplyr::rows_patch(tibble::rowid_to_column(x[[2]][nms_all]), 'rowid') |>
    cbind(x[[1]][setdiff(nms_x, nms_y)],
          x[[2]][setdiff(nms_y, nms_x)])  |>
    select(-rowid)
  x[[1]] <- NULL
  Recall(x)
}


patch_all(lst(data1, data2, data3))
  x1 x2 x3 x4 x5  y z
1  1  3 NA NA NA 11 6
2 NA  1  3 NA NA 12 5
3  2  3 NA NA NA 13 4
4  2 NA  1 NA NA 14 3
5 NA  2  1 NA  3 15 2
6 NA NA NA  2  3 16 1

R相关问答推荐

以R表示的gglikert地块调整总数

使用R的序列覆盖

terra nearest()仅为所有`to_id`列返回NA

判断字符串中数字的连续性

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

如何使下一个按钮只出现在Rshiny 的一段时间后?""

为什么当用osmdata映射R时会得到相邻状态?

使用较长的查询提取具有部分匹配的列表中的较短目标,

根据现有列的名称和字符串的存在进行变异以创建多个新列

如何将R中数据帧中的任何Nas替换为最后4个值

计算数据帧中指定值之前的行数,仅基于每行之后的future 行,单位为r

如何使用前缀作为匹配来连接数据帧?

从数据创建数字的命名列表.R中的框

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

将多个列合并为一个列的有效方法是什么?

如何在R中使用因子行求和?

无法保存gglot的所有pdf元素

将R中对象的CSV数组转换为JSON数组

按顺序将地块添加到列表