【问题标题】:How to create a new list in R merging each data frame with previous data frame into the same list如何在 R 中创建一个新列表,将每个数据帧与前一个数据帧合并到同一个列表中
【发布时间】:2013-12-06 02:09:18
【问题描述】:

大家好,我正在尝试解决 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

我的问题是如何将每个数据帧与同一列表中的 previuos 数据帧合并,例如 a1 将与 a1 合并,a2 将与 a1 合并,a3 将与a2a1 合并,a4 将合并a3a2a1a5 将合并a4a3a16@4 .我正在考虑 ID var 在每个数据帧中添加 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

我在内部使用函数Reducemerge,但在第一刻我只合并了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() 中使用了相同的代码,但出现错误。 dput 版本的 list 是下一个:

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"))

感谢您的帮助。

【问题讨论】:

  • Reduce 通话末尾添加accumulate=TRUE 是否能满足您的需求?
  • 亲爱的@thelatemail,但是当我添加list 时,我不知道如何为list 中的每个元素使用accumulate=TRUE,我只得到了一个包含第一个元素的数据框。你能帮我解决这个问题吗?
  • 我使用accumulate=TRUE 在列表中获得了 5 个 data.frames - 检查您的结果。
  • 亲爱的@thelatemail 你有理由,但选项all.x=TRUE 没有效果我没有得到NA,这是必要的。有办法解决吗?
  • Reduce 函数(令人惊讶)无法为输入函数接收更多参数

标签: r


【解决方案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
## 

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多