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

时间:2015-01-18 13:27:10

标签: r 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个1列表的列表中。

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

> 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 ...

请忽略尺寸和值的差异。

2 个答案:

答案 0 :(得分:4)

尽管exctractor函数[[ ]]具有不寻常的语法,但事实上它是一个像其他函数一样的函数,因此可以提供给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

答案 1 :(得分:4)

你可以尝试

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))))