我有一个数据帧列表,其中有不同的行数,但只有id

set.seed(1)
f <- function(){
  m <- matrix(1:40,ncol = 4, dimnames = list(NULL, paste0("x",1:4)))
  m <- cbind.data.frame(id=1:10, m)
  m[-sample(10,sample(9,1)),]
  
}  
li <- lapply(1:5,\(x) f())  ; names(li) <- paste0("Obj ", 1:length(li))
li

$`Obj 1`
  id x1 x2 x3 x4
6  6  6 16 26 36

$`Obj 2`
   id x1 x2 x3 x4
2   2  2 12 22 32
3   3  3 13 23 33
4   4  4 14 24 34
6   6  6 16 26 36
7   7  7 17 27 37
8   8  8 18 28 38
10 10 10 20 30 40

$`Obj 3`
  id x1 x2 x3 x4
2  2  2 12 22 32
3  3  3 13 23 33
4  4  4 14 24 34
8  8  8 18 28 38

$`Obj 4`
  id x1 x2 x3 x4
6  6  6 16 26 36

$`Obj 5`
   id x1 x2 x3 x4
1   1  1 11 21 31
4   4  4 14 24 34
5   5  5 15 25 35
7   7  7 17 27 37
9   9  9 19 29 39
10 10 10 20 30 40

我需要将它们全部合并在一起

merged_df <- Reduce(\(x,y) merge(x, y, by = "id", all = T), li)

merged_df
 id x1.x x2.x x3.x x4.x x1.y x2.y x3.y x4.y x1.x x2.x x3.x x4.x x1.y x2.y x3.y x4.y x1 x2 x3 x4
1   1   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  1 11 21 31
2   2   NA   NA   NA   NA    2   12   22   32    2   12   22   32   NA   NA   NA   NA NA NA NA NA
3   3   NA   NA   NA   NA    3   13   23   33    3   13   23   33   NA   NA   NA   NA NA NA NA NA
4   4   NA   NA   NA   NA    4   14   24   34    4   14   24   34   NA   NA   NA   NA  4 14 24 34
5   5   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  5 15 25 35
6   6    6   16   26   36    6   16   26   36   NA   NA   NA   NA    6   16   26   36 NA NA NA NA
7   7   NA   NA   NA   NA    7   17   27   37   NA   NA   NA   NA   NA   NA   NA   NA  7 17 27 37
8   8   NA   NA   NA   NA    8   18   28   38    8   18   28   38   NA   NA   NA   NA NA NA NA NA
9   9   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA  9 19 29 39
10 10   NA   NA   NA   NA   10   20   30   40   NA   NA   NA   NA   NA   NA   NA   NA 10 20 30 40

然后将其返回到列表中,同时保留列表中原始列的原始名称以及原始列表中每个列表对象的名称.

我怎么能做到这一点?

=========UPD========

这是我原来的单子

$`Obj 1`
  id x1 x2
1  1  1  4
3  3  3  6

$`Obj 2`
  id x1 x2
2  2  2  5
3  3  3  6

我想买这个

$Obj1
  id x1 x2
1  1  1  4
2  2 NA NA
3  3  3  6

$Obj2
  id x1 x2
1  1 NA NA
2  2  2  5
3  3  3  6

推荐答案

我不认为这是一种减少,我怀疑这只是在所有帧中强制执行所有id.

lapply(li, merge,
   data.frame(id = sort(unique(unlist(lapply(li, `[[`, "id"))))),
   by = "id", all = TRUE)
# $`Obj 1`
#    id x1 x2 x3 x4
# 1   1 NA NA NA NA
# 2   2 NA NA NA NA
# 3   3 NA NA NA NA
# 4   4 NA NA NA NA
# 5   5 NA NA NA NA
# 6   6  6 16 26 36
# 7   7 NA NA NA NA
# 8   8 NA NA NA NA
# 9   9 NA NA NA NA
# 10 10 NA NA NA NA
# $`Obj 2`
#    id x1 x2 x3 x4
# 1   1 NA NA NA NA
# 2   2  2 12 22 32
# 3   3  3 13 23 33
# 4   4  4 14 24 34
# 5   5 NA NA NA NA
# 6   6  6 16 26 36
# 7   7  7 17 27 37
# 8   8  8 18 28 38
# 9   9 NA NA NA NA
# 10 10 10 20 30 40
# $`Obj 3`
#    id x1 x2 x3 x4
# 1   1 NA NA NA NA
# 2   2  2 12 22 32
# 3   3  3 13 23 33
# 4   4  4 14 24 34
# 5   5 NA NA NA NA
# 6   6 NA NA NA NA
# 7   7 NA NA NA NA
# 8   8  8 18 28 38
# 9   9 NA NA NA NA
# 10 10 NA NA NA NA
# $`Obj 4`
#    id x1 x2 x3 x4
# 1   1 NA NA NA NA
# 2   2 NA NA NA NA
# 3   3 NA NA NA NA
# 4   4 NA NA NA NA
# 5   5 NA NA NA NA
# 6   6  6 16 26 36
# 7   7 NA NA NA NA
# 8   8 NA NA NA NA
# 9   9 NA NA NA NA
# 10 10 NA NA NA NA
# $`Obj 5`
#    id x1 x2 x3 x4
# 1   1  1 11 21 31
# 2   2 NA NA NA NA
# 3   3 NA NA NA NA
# 4   4  4 14 24 34
# 5   5  5 15 25 35
# 6   6 NA NA NA NA
# 7   7  7 17 27 37
# 8   8 NA NA NA NA
# 9   9  9 19 29 39
# 10 10 10 20 30 40

R相关问答推荐

在R底座中更改白天和夜晚的背景 colored颜色

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

如何使用R Shiny中的条件面板仅隐藏和显示用户输入,同时仍允许运行基础计算?

如何求解arg必须为NULL或deSolve包的ode函数中的字符向量错误

在使用ggroove后,将图例合并在gplot中

使用Facet_WRAP时更改框图中线的 colored颜色

SHINY:使用JS函数应用的CSS样式显示HTML表格

合并后返回列表的数据帧列表

如何识别倒排的行并在R中删除它们?

停止ggplot将多行减少到一行

使用ggplot2中的sec_axis()调整次轴

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

R中时间间隔的大向量与参考时间间隔的相交

防止正则表达式覆盖以前的语句

如何在一种 colored颜色 中设置数值变量的 colored颜色 和高于阈值的 colored颜色 点?

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

按顺序将地块添加到列表

在shiny /bslb中,当卡片是从json生成时,如何水平排列卡片?

只有当我在循环的末尾放置一条print语句时,Foreach才会给出预期的输出