首页 > 解决方案 > 如何跨第三级命名列表 rbind data.frames?

问题描述

第 1 层的列表“l_start”是一个命名列表,它本身在第 2 层嵌套命名列表(“l1”,“l1a”),在第 3 层依次包含 2-3 个数据帧(a、b 和可能的 c)。

目标是根据名称在第 3 级 rbind 数据帧(如果可用)以获得“l_finish”(首选 data.table 和 rlist 解决方案,但 purrr 或 base 也可以)

# Level 2
l1 <- 
  # Level 3
  list(a = data.frame(matrix(1:4, ncol=2)),
       b = data.frame(matrix(1:4, ncol=2)),
       c= data.frame(matrix(1:4, ncol=2)))

# Level 2
l1a <- 
  # Level 3
  list(a = data.frame(matrix(1:6, ncol=2)),
       b = data.frame(matrix(1:6, ncol=2)))


# Level 1 "l_start"
l_start <- 
  list(l1, l1a)
names(l_start) <- c("l1", "l1a")

“l_finish”应该是什么样子

l_finish <- 
  list(l1_1a = list(a = rbind(l1$a, l1a$a),
                 b = rbind(l1$b, l1a$b)))

希望最终产品“l_finish”注意,c 被删除,因为不在两个列表中

l_finish
#> $l1_1a
#> $l1_1a$a
#>   X1 X2
#> 1  1  3
#> 2  2  4
#> 3  1  4
#> 4  2  5
#> 5  3  6
#> 
#> $l1_1a$b
#>   X1 X2
#> 1  1  3
#> 2  2  4
#> 3  1  4
#> 4  2  5
#> 5  3  6

关闭但无法完全到达那里

Rbind 发生在嵌套列表中的示例 rbind 数据帧之上一级

列表中只有一个 df 名称,而不是 R 列表中的多个 rbind data.frames

标签: rdata.tablebindnested-lists

解决方案


一个purrr解决方案:

library(purrr)
cols <- intersect(names(l_start[[1]]), names(l_start[[2]]))

map(l_start, `[`, cols) %>% transpose() %>% map(bind_rows)

#$a
#  X1 X2
#1  1  3
#2  2  4
#3  1  4
#4  2  5
#5  3  6

#$b
#  X1 X2
#1  1  3
#2  2  4
#3  1  4
#4  2  5
#5  3  6

intersect我们使用,选择列表中的常用名称transpose并绑定行。


推荐阅读