大家好我想用R中的数据框列表解决一个小问题。我有一个数据框列表,结构如下:
list
$a1
ID Mount s1
1 001 1 1
2 002 2 1
3 003 3 1
4 004 4 1
5 005 5 1
6 006 6 1
7 007 7 1
8 009 8 1
9 010 9 1
$a2
ID Mount s2
1 001 1 2
2 002 2 2
3 003 3 2
4 004 4 2
5 005 5 2
6 006 6 2
7 007 7 2
8 009 8 2
9 010 9 2
10 011 10 2
11 012 11 2
$a3
ID Mount s3
1 001 1 3
2 002 2 3
3 003 3 3
4 004 4 3
5 005 5 3
6 006 6 3
7 007 7 3
8 009 8 3
9 010 9 3
10 011 10 3
11 012 11 3
12 013 11 3
13 014 11 3
$a4
ID Mount s4
1 001 1 4
2 002 2 4
3 003 3 4
4 004 4 4
5 005 5 4
6 006 6 4
7 007 7 4
8 009 8 4
9 010 9 4
10 011 10 4
11 012 11 4
12 013 11 4
13 014 11 4
14 015 12 4
15 016 12 4
$a5
ID Mount s5
1 001 1 5
2 002 2 5
3 003 3 5
4 004 4 5
5 005 5 5
6 006 6 5
7 007 7 5
8 009 8 5
9 010 9 5
10 011 10 5
11 012 11 5
12 013 11 5
13 014 11 5
14 015 12 5
15 016 12 5
16 017 14 5
17 018 14 5
我的问题是如何将每个数据框与同一列表中的前置数据框合并,例如a1
将与a1
合并,a2
将与{{{}}合并1}},a1
将与a3
和a2
合并,a1
将合并a4
,a3
和a2
和a1
将合并a5
,a4
,a3
和a2
。我正在进行此合并,考虑a1
var在每个数据框中添加ID
。我想在新的列表中得到这样的东西:
s
我在list.merged
$a1
ID Mount s1
1 001 1 1
2 002 2 1
3 003 3 1
4 004 4 1
5 005 5 1
6 006 6 1
7 007 7 1
8 009 8 1
9 010 9 1
$a2
ID Mount s2 s1
1 001 1 2 1
2 002 2 2 1
3 003 3 2 1
4 004 4 2 1
5 005 5 2 1
6 006 6 2 1
7 007 7 2 1
8 009 8 2 1
9 010 9 2 1
10 011 10 2 NA
11 012 11 2 NA
$a3
ID Mount s3 s2 s1
1 001 1 3 2 1
2 002 2 3 2 1
3 003 3 3 2 1
4 004 4 3 2 1
5 005 5 3 2 1
6 006 6 3 2 1
7 007 7 3 2 1
8 009 8 3 2 1
9 010 9 3 2 1
10 011 10 3 2 NA
11 012 11 3 2 NA
12 013 11 3 NA NA
13 014 11 3 NA NA
$a4
ID Mount s4 s3 s2 s1
1 001 1 4 3 2 1
2 002 2 4 3 2 1
3 003 3 4 3 2 1
4 004 4 4 3 2 1
5 005 5 4 3 2 1
6 006 6 4 3 2 1
7 007 7 4 3 2 1
8 009 8 4 3 2 1
9 010 9 4 3 2 1
10 011 10 4 3 2 NA
11 012 11 4 3 2 NA
12 013 11 4 3 NA NA
13 014 11 4 3 NA NA
14 015 12 4 NA NA NA
15 016 12 4 NA NA NA
$a5
ID Mount s5 s4 s3 s2 s1
1 001 1 5 4 3 2 1
2 002 2 5 4 3 2 1
3 003 3 5 4 3 2 1
4 004 4 5 4 3 2 1
5 005 5 5 4 3 2 1
6 006 6 5 4 3 2 1
7 007 7 5 4 3 2 1
8 009 8 5 4 3 2 1
9 010 9 5 4 3 2 1
10 011 10 5 4 3 2 NA
11 012 11 5 4 3 2 NA
12 013 11 5 4 3 NA NA
13 014 11 5 4 3 NA NA
14 015 12 5 4 NA NA NA
15 016 12 5 4 NA NA NA
16 017 14 5 NA NA NA NA
17 018 14 5 NA NA NA NA
内部使用Reduce
函数,但在第一时间我只与merge
中的所有数据框合并a1
。我用下一个函数来做到这一点:
list
但是我得到了一个数据框而不是带有合并数据帧的列表。我不知道是否有可能重新定义最后一个代码以应用于list.merged=Reduce(function(x, y) merge(x, y[,c(1,3)],by.x="ID",by.y="ID",all.x=TRUE),list)
中的每个数据帧,因为我使用与list
相同的代码但是我收到了错误。 lapply()
的{{1}}版本是下一个:
dput
感谢您的帮助。
答案 0 :(得分:1)
您可以在Reduce
中编写内联函数,将all=TRUE
参数传递给merge
。
因此,如果您的数据位于列表LL
中(不要将对象命名为list
,因为它也是R中的函数)
Reduce(f = function(x, y) merge(x, y, all = TRUE), LL, accumulate = T)
## [[1]]
## ID Mount s1
## 1 001 1 1
## 2 002 2 1
## 3 003 3 1
## 4 004 4 1
## 5 005 5 1
## 6 006 6 1
## 7 007 7 1
## 8 009 8 1
## 9 010 9 1
##
## [[2]]
## ID Mount s1 s2
## 1 001 1 1 2
## 2 002 2 1 2
## 3 003 3 1 2
## 4 004 4 1 2
## 5 005 5 1 2
## 6 006 6 1 2
## 7 007 7 1 2
## 8 009 8 1 2
## 9 010 9 1 2
## 10 011 10 NA 2
## 11 012 11 NA 2
##
## [[3]]
## ID Mount s1 s2 s3
## 1 001 1 1 2 3
## 2 002 2 1 2 3
## 3 003 3 1 2 3
## 4 004 4 1 2 3
## 5 005 5 1 2 3
## 6 006 6 1 2 3
## 7 007 7 1 2 3
## 8 009 8 1 2 3
## 9 010 9 1 2 3
## 10 011 10 NA 2 3
## 11 012 11 NA 2 3
## 12 013 11 NA NA 3
## 13 014 11 NA NA 3
##
## [[4]]
## ID Mount s1 s2 s3 s4
## 1 001 1 1 2 3 4
## 2 002 2 1 2 3 4
## 3 003 3 1 2 3 4
## 4 004 4 1 2 3 4
## 5 005 5 1 2 3 4
## 6 006 6 1 2 3 4
## 7 007 7 1 2 3 4
## 8 009 8 1 2 3 4
## 9 010 9 1 2 3 4
## 10 011 10 NA 2 3 4
## 11 012 11 NA 2 3 4
## 12 013 11 NA NA 3 4
## 13 014 11 NA NA 3 4
## 14 015 12 NA NA NA 4
## 15 016 12 NA NA NA 4
##
## [[5]]
## ID Mount s1 s2 s3 s4 s5
## 1 001 1 1 2 3 4 5
## 2 002 2 1 2 3 4 5
## 3 003 3 1 2 3 4 5
## 4 004 4 1 2 3 4 5
## 5 005 5 1 2 3 4 5
## 6 006 6 1 2 3 4 5
## 7 007 7 1 2 3 4 5
## 8 009 8 1 2 3 4 5
## 9 010 9 1 2 3 4 5
## 10 011 10 NA 2 3 4 5
## 11 012 11 NA 2 3 4 5
## 12 013 11 NA NA 3 4 5
## 13 014 11 NA NA 3 4 5
## 14 015 12 NA NA NA 4 5
## 15 016 12 NA NA NA 4 5
## 16 017 14 NA NA NA NA 5
## 17 018 14 NA NA NA NA 5
##