如何以递归方式合并列表列表的相应元素

时间:2012-05-24 16:19:45

标签: r

实施例

a
[[1]]
[[1]]$`1`
    ID     Values
1   4     160.08858
2   8     83.35774
3   30    51.21873
4   38    54.92554
5   44    77.06082

[[1]]$`2`
    ID     Values
1   4     0.08858
2   8     183.35774

[[2]]
[[2]]$`1`
    ID     Values
3   30    51.21873
4   38    54.92554
5   44    77.06082

[[2]]$`2`
    ID     Values
1   4     0.08858
2   8     183.35774
3   30    51.21873
5   44    77.06082

[[3]]
[[3]]$`1`
    ID     Values
5   44    77.06082

[[3]]$`2`
    ID     Values
1   4     0.08858
3   30    51.21873

我想有一个列表,其中第一个元素是相同的,但第一个列表的第二个元素与元素1的第一个列表合并,第二个元素与seond和simillarly合并,列表的第三个元素,第一个数据帧应该与列表的前一个元素的前两个数据帧合并,并与相应的后两个元素合并。

结果应该是

RESULT
[[1]]
[[1]]$`1`
    ID     Values
1   4     160.08858
2   8     83.35774
3   30    51.21873
4   38    54.92554
5   44    77.06082

[[1]]$`2`
    ID     Values
1   4     0.08858
2   8     183.35774

[[2]]
[[2]]$`1`
    ID     Values
3   30    51.21873
4   38    54.92554
5   44    77.06082
1   4     160.08858
2   8     83.35774
3   30    51.21873
4   38    54.92554
5   44    77.06082


[[2]]$`2`
    ID     Values
1   4     0.08858
2   8     183.35774
3   30    51.21873
5   44    77.06082
1   4     0.08858
2   8     183.35774


[[3]]
[[3]]$`1`
    ID     Values
5   44    77.06082
3   30    51.21873
4   38    54.92554
5   44    77.06082
1   4     160.08858
2   8     83.35774
3   30    51.21873
4   38    54.92554
5   44    77.06082


[[3]]$`2`
    ID     Values
1   4     0.08858
3   30    51.21873
1   4     0.08858
2   8     183.35774
3   30    51.21873
5   44    77.06082
1   4     0.08858
2   8     183.35774

1 个答案:

答案 0 :(得分:5)

这应该可以解决问题。 (我没有粘贴在输出中,因为它非常庞大,很容易在你自己的控制台上重现。)

# Create some analogous data
df <- data.frame(ID=LETTERS[1:6], Values=5*(1:6), stringsAsFactors=FALSE)
DL <- list(list(`1`=df[1,], `2`=df[2,]),
           list(`1`=df[3,], `2`=df[4,]),
           list(`1`=df[5,], `2`=df[6,]))

# Build a function that does what you want for a pair of inputs
myrbind <- function(x, y) {
    mapply(rbind, y, x, SIMPLIFY=FALSE)
}
myrbind(DL[[1]], DL[[2]]) # Try it out

# Use Reduce to make the merges accumulate as it works through the list.
Reduce(f = myrbind, x = DL, accumulate = TRUE)