将列表列表简化为单个列表

Simplify list of lists into a single list

我有一个存储为列表列表的大型数据集:

> str(list1)
List of 100
 $ :List of 1
  ..$ : num [1:2500, 1:18, 1:14] 0.467 0.556 0.422 0.556 0.511 ...
 $ :List of 1
  ..$ : num [1:2500, 1:18, 1:14] 0.622 0.644 0.378 0.556 0.667 ...
 $ :List of 1

它存储在一个包含 100 个列表的列表中。

我想将其简化为具有以下结构的单个列表:

> str(list2)
List of 100
 $ : num [1:2, 1:4, 1:3] 0 0 0 0 0 0 0 0 0 0 ...
 $ : num [1:2, 1:4, 1:3] 0 0 0 0 0 0 0 0 0 0 ...
 $ : num [1:2, 1:4, 1:3] 0 0 0 0 0 0 0 0 0 0 ...

请忽略尺寸和数值的差异..

尽管抽取函数 [[ ]] 的语法不寻常,但实际上它与任何其他函数一样,因此可以提供给 lapply。通过这样做

list2 <- lapply(list1, "[[", 1)

你基本上是在自动化这个

list2 <- list(list1[[1]][[1]],
              list1[[2]][[1]],
              list1[[3]][[1]],
              ... )

或者,也许更容易阅读的是单独展平每个元素,产生完全相同的结果。

list2 <- lapply(list1, unlist)

基准测试

@akrun 的解决方案似乎是迄今为止最快的,但除非速度是个问题,否则我建议您选择最容易阅读的解决方案。它们也可能根据数据产生不同的结果。

library(microbenchmark)
list1 <- replicate(100, list(1:100), simplify=FALSE)
microbenchmark(lapply(list1, "[[", 1),
               lapply(list1, unlist),
               unlist(list1, recursive=FALSE))

Unit: microseconds
                             expr     min       lq      mean   median       uq
           lapply(list1, "[[", 1)  32.432  39.2845  43.41272  42.5970  47.1985
            lapply(list1, unlist) 109.011 135.5720 148.27474 153.3045 157.9720
 unlist(list1, recursive = FALSE)   2.733   3.0585   3.94177   3.2430   4.1255
     max neval cld
  73.024   100  b 
 202.294   100   c
  21.860   100 a

你可以试试

unlist(list1, recursive=FALSE)

数据

list1 <- list(list(structure(1:24, .Dim = c(2L, 4L, 3L))),
 list(structure(1:24, .Dim = c(2L, 
 4L, 3L))), list(structure(1:24, .Dim = c(2L, 4L, 3L))))