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

3

大家好,我正在尝试解决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将与a1合并,a3将与a2a1合并,a4将与a3a2a1合并,a5将与a4a3a2a1合并。我考虑使用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,但是一开始我仅将a1list中的所有数据框合并。我使用了下面的函数来解决这个问题:

list.merged=Reduce(function(x, y) merge(x, y[,c(1,3)],by.x="ID",by.y="ID",all.x=TRUE),list)

但是我得到了一个数据框而不是合并的数据框列表。我不知道是否可以重新定义上一个代码以适用于list中的每个数据框,因为我使用相同的代码与lapply()一起使用,但是出现了错误。 listdput版本如下:

structure(list(a1 = structure(list(ID = c("001", "002", "003", 
"004", "005", "006", "007", "009", "010"), Mount = c(1, 2, 3, 
4, 5, 6, 7, 8, 9), s1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1)), .Names = c("ID", 
"Mount", "s1"), row.names = c(NA, 9L), class = "data.frame"), 
    a2 = structure(list(ID = c("001", "002", "003", "004", "005", 
    "006", "007", "009", "010", "011", "012"), Mount = c(1, 2, 
    3, 4, 5, 6, 7, 8, 9, 10, 11), s2 = c(2, 2, 2, 2, 2, 2, 2, 
    2, 2, 2, 2)), .Names = c("ID", "Mount", "s2"), row.names = c(NA, 
    11L), class = "data.frame"), a3 = structure(list(ID = c("001", 
    "002", "003", "004", "005", "006", "007", "009", "010", "011", 
    "012", "013", "014"), Mount = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 
    10, 11, 11, 11), s3 = c(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
    3, 3)), .Names = c("ID", "Mount", "s3"), row.names = c(NA, 
    13L), class = "data.frame"), a4 = structure(list(ID = c("001", 
    "002", "003", "004", "005", "006", "007", "009", "010", "011", 
    "012", "013", "014", "015", "016"), Mount = c(1, 2, 3, 4, 
    5, 6, 7, 8, 9, 10, 11, 11, 11, 12, 12), s4 = c(4, 4, 4, 4, 
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4)), .Names = c("ID", "Mount", 
    "s4"), row.names = c(NA, 15L), class = "data.frame"), a5 = structure(list(
        ID = c("001", "002", "003", "004", "005", "006", "007", 
        "009", "010", "011", "012", "013", "014", "015", "016", 
        "017", "018"), Mount = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
        11, 11, 11, 12, 12, 14, 14), s5 = c(5, 5, 5, 5, 5, 5, 
        5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5)), .Names = c("ID", "Mount", 
    "s5"), row.names = c(NA, 17L), class = "data.frame")), .Names = c("a1", 
"a2", "a3", "a4", "a5"))

感谢您的帮助。

1
在你的 Reduce 函数调用末尾添加 accumulate=TRUE 是否能达到你想要的效果? - thelatemail
1
我使用 accumulate=TRUE 在列表中获取了5个数据框 - 请检查您的结果。 - thelatemail
“Reduce”函数(令人惊讶地)没有能力为输入函数提供更多的参数。 - CHP
亲爱的@AnandaMahto,只有一个小问题:all=TRUE会在每个数据框中保留所有的ID变量,与all.x=TRUE有什么区别?我对此没有清晰的想法。 - Duck
亲爱的@AnandaMahto,有个小问题:R中的merge()是否等同于Excel中的vlookup函数?或者如何调整merge()以使其与vlookup函数相同工作? - Duck
显示剩余4条评论
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接