R:按名称组合嵌套列表元素

R:按名称组合嵌套列表元素,r,R,假设我有一个列表结构,其中有嵌套在每个元素中的data.frames l <- list(A = list(D = data.frame(V1 = seq(3), V2 = LETTERS[1:3]), E = data.frame(V1 = seq(3), V2 = LETTERS[4:6])), B = list(D = data.frame(V1 = seq(3), V2 = LETTERS[7:9]),

假设我有一个列表结构,其中有嵌套在每个元素中的
data.frames

l <- list(A = list(D = data.frame(V1 = seq(3), V2 = LETTERS[1:3]),
                   E = data.frame(V1 = seq(3), V2 = LETTERS[4:6])),
          B = list(D = data.frame(V1 = seq(3), V2 = LETTERS[7:9]),
                   E = data.frame(V1 = seq(3), V2 = LETTERS[10:12])))

$A
$A$D
  V1 V2
1  1  A
2  2  B
3  3  C

$A$E
  V1 V2
1  1  D
2  2  E
3  3  F


$B
$B$D
  V1 V2
1  1  G
2  2  H
3  3  I

$B$E
  V1 V2
1  1  J
2  2  K
3  3  L
我可以通过一个循环来实现这一点,但我正在尝试找到更高效/优雅的东西

out <- vector("list", length(list))
for(i in c("D","E")){
  out[[i]] <- do.call("rbind", lapply(l, function(x) x[[i]]))
}

out我不知道这是否更有效:

l1 <- unlist(l, recursive = FALSE)
D <- do.call(rbind, l1[grepl("\\.D", names(l1))])
E <- do.call(rbind, l1[grepl("\\.E", names(l1))])
library(data.table)

lapply(c('E','D'), function(u) rbindlist(lapply(l, `[[`, u)))
#$A
#   V1 V2
#1:  1  D
#2:  2  E
#3:  3  F
#4:  1  J
#5:  2  K
#6:  3  L

#$B
#   V1 V2
#1:  1  A
#2:  2  B
#3:  3  C
#4:  1  G
#5:  2  H
#6:  3  I

l1我们将嵌套的
列表
展平为一个包含4个元素(
l1
)的
列表
,然后使用
替换前缀部分后,
按“l1”的名称拆分
。然后,我们使用
do.call
rbind
嵌套的
list

l1 <- do.call('c', l)
lapply(split(l1,sub('.*\\.', '', names(l1))),
                      function(x) do.call(rbind, x))

我会对data.table使用更优雅的方法(不一定更高效):

在base R中,这可以通过

lapply(c('E','D'), function(u) do.call(rbind, lapply(l, `[[`, u)))

很好,你能解释一下正则表达式吗?我对它不太熟悉。
library(data.table)

lapply(c('E','D'), function(u) rbindlist(lapply(l, `[[`, u)))
#$A
#   V1 V2
#1:  1  D
#2:  2  E
#3:  3  F
#4:  1  J
#5:  2  K
#6:  3  L

#$B
#   V1 V2
#1:  1  A
#2:  2  B
#3:  3  C
#4:  1  G
#5:  2  H
#6:  3  I
lapply(c('E','D'), function(u) do.call(rbind, lapply(l, `[[`, u)))