"combine" 来自 R 中多个列表的多元素索引的所有组合的更好方法?

Better way to "combine" all combinations of multi-element indices from multiple lists in R?

假设我有两个列表,每个列表在多个索引中包含可变数量的多个子元素:

list.a <- list(c("a","b","c"), c("x", "y", "z"))
list.b <- list(c("d", "e", "f","g"), c("m", "n"))

如何从每个列表的相应索引中递归访问每个 combo 子元素?

mapply 当我从每个列表中有多个子元素时似乎不起作用(特别是如果两个列表中的元素数量不相等):

> mapply(paste,list.a,list.b)
[[1]]
[1] "a d" "b e" "c f" "a g"

[[2]]
[1] "x m" "y n" "z m"

我知道我也可以使用 for 循环...:[=​​29=]

list.d <- list()
for(i in 1:length(list.a)) {
  list.c <- list()
  list.d[[i]] <- {
    for(j in list.a[[i]]) {
      for(k in list.b[[i]]) {
       list.c <- c(list.c, paste(j, k))
      }
    }
    unlist(list.c)
    }
}

产生所需结果:

> list.d
[[1]]
 [1] "a d" "a e" "a f" "a g" "b d" "b e" "b f" "b g" "c d" "c e" "c f" "c g"

[[2]]
[1] "x m" "x n" "y m" "y n" "z m" "z n"

...但是循环充其量是混乱的,并且对于巨大的列表变得相当慢。

有更好的方法吗?



<申请>

(这部分不需要回答问题,但提供context/extension它的使用):

对于那些好奇的人,我想将其扩展到 paste() 之外,而是想在 data.frame 上使用它。

你需要expand.grid,它用来:

Create a data frame from all combinations of the supplied vectors or factors.

使用do.call(paste, ...)是将数据框的所有列粘贴在一起。

Map(function(a,b) do.call(paste, expand.grid(a,b)), list.a, list.b)

#[[1]]
# [1] "a d" "b d" "c d" "a e" "b e" "c e" "a f" "b f" "c f" "a g" "b g" "c g"

#[[2]]
#[1] "x m" "y m" "z m" "x n" "y n" "z n"

对于问题的第二部分,我们可以先按年份对数据框进行子集化并绘制,然后按聚合面积使用 rowsum:

Map(function(years, plots) {
    with(subset(dat, plot %in% plots & year %in% years), rowsum(area, year))
}, l1, l2)

[[1]]
     [,1]
1933  257
1934  398
1935  640

[[2]]
     [,1]
1950  950
1951  457
1952  601
1953 1202
1954 1148

[[3]]
     [,1]
2012  736
2013  497