如何在R中创建新列表,将每个数据帧与先前数据帧合并到同一列表中

时间:2013-12-06 02:09:19

标签: r

大家好我想用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将与a3a2合并,a1将合并a4a3a2a1将合并a5a4a3a2。我正在进行此合并,考虑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

感谢您的帮助。

1 个答案:

答案 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
##