我有一个大型数据集,存储为列表列表:
> 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 ...
请忽略尺寸和值的差异。
答案 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))))