首页 > 解决方案 > 将列表 A 中数据框中的最后一个值与列表 B 中数据框中的第一个值相加

问题描述

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

 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。

标签: rdplyrlapply

解决方案


尝试地图/映射:

# 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

或者:

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

推荐阅读