【发布时间】: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 将与a2 和a1 合并,a4 将合并a3,a2 和a1 和a5 将合并a4,a3,a16@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
我在内部使用函数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() 中使用了相同的代码,但出现错误。 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