将列表列表简化为单个列表
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))))
我有一个存储为列表列表的大型数据集:
> 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))))