将列表A中数据框的最后一个值与列表B中数据框的第一个值相加

时间:2018-10-12 04:49:52

标签: r dplyr lapply

我有两个包含500个数据帧的列表。这是两个包含两个数据帧的列表的示例。

 l1
    [[1]]
      X1 X2 X3
    1  1  0  0
    2  5  1  8

    [[2]]
      X1 X2 X3
    1  0  1  1
    2  3  0  4

l2
   [[1]]
      X1 X2 X3
    1  1  1  0
    2  0  1  1

    [[2]]
      X1 X2 X3
    1  0  1  0
    2  0  1  1

我需要将数据框的一列中的最后一个值与另一个列表中的数据框中的同一列的第一个值相加。例如:

l1[[1]]$x1[2] to l2[[1]]$x1[1] ; and l1[[1]]$x3[2] to l2[[1]]$x3[1] 

在我的示例中,预期结果应记录在l2中包含的数据框中,并且应如下所示:

> l2
[[1]]
  X1 X2 X3
1  6  2  8
2  0  1  1

[[2]]
  X1 X2 X3
1  3  1  4
2  0  1  1

我打算使用包含500个数据帧的列表来执行此操作。我会更喜欢Dplyr。

1 个答案:

答案 0 :(得分:0)

尝试地图/映射:

# data
l1 <- list("X1 X2 X3
1  1  0  0
          2  5  1  8",
          "X1 X2 X3
1  0  1  1
          2  3  0  4")

l1 <- lapply(l1, function(x) read.table(text = x, header = TRUE))

l2 <- list("X1 X2 X3
1  1  1  0
           2  0  1  1",
           "X1 X2 X3
1  0  1  0
           2  0  1  1")
l2 <- lapply(l2, function(x) read.table(text =x, header = T))

# Map
Map(function(a, b) rbind(a[2, ] + b[1,  ], b[2, ]), l1, l2)

# [[1]]
# X1 X2 X3
# 2   6  2  8
# 21  0  1  1
# 
# [[2]]
# X1 X2 X3
# 2   3  1  4
# 21  0  1  1

OR:

library(tidyverse)
map2(l1, l2, ~bind_rows(.x %>%
                          slice(2) %>%
                          bind_rows(.y %>%
                                      slice(1)) %>%
                          summarise_all(funs(sum)), 
                        .y %>%
                          slice(2)))