考虑以下(简单)列表列表:
big_lst = list(list(rnorm(3), rnorm(4)), list(rnorm(3), rnorm(4)))
#> big_lst
#[[1]]
#[[1]][[1]]
#[1] 0.63620243 -0.01875264 -2.77235708
#[[1]][[2]]
#[1] 1.0527421 -0.3302443 1.2028328 -0.4019282
#[[2]]
#[[2]][[1]]
#[1] -1.6071500 -0.2870488 -0.1432817
#[[2]][[2]]
#[1] 0.7149935 -0.3090975 1.0108511 1.0419313
从这个列表中,我想创建两个子列表,如下所示:
big_lst
每个子列表的所有第一个元素的列表:换句话说,第一个列表应包含 [1] [[1]] 和 [2] [[1]] 即可。big_lst
每个子列表中所有第二个元素的列表:换句话说,第二个列表应包含 [1] [[2]] 和 [2] [[2]] 即可。有没有简单的方法呢?我觉得这与方法split
有关,但我无法使其发挥作用。
谢谢,
答案 0 :(得分:2)
你可以这样做:
split(do.call(c, big_lst), 1:2)
基准:
big_lst <- rep(big_lst, 100)
josh <- function() do.call(mapply, c(list, big_lst, SIMPLIFY=FALSE))
matthew <- function() split(do.call(c, big_lst), 1:2)
microbenchmark(josh(), matthew())
# Unit: microseconds
# expr min lq median uq max neval
# josh() 351.5 362.4 375.5 397.0 3191.9 100
# matthew() 142.6 147.6 151.8 159.1 239.3 100
答案 1 :(得分:2)
## Better example data
big_lst <- list(list(1:2, LETTERS[1:2]), list(3:4, LETTERS[3:4]))
## Use do.call to construct and evaluate a call that will look like:
## mapply(list, big_lst[[1]], ..., big_lst[[n]], SIMPLIFY=FALSE)
do.call(mapply, c(list, big_lst, SIMPLIFY=FALSE))
# [[1]]
# [[1]][[1]]
# [1] 1 2
#
# [[1]][[2]]
# [1] 3 4
#
#
# [[2]]
# [[2]][[1]]
# [1] "A" "B"
#
# [[2]][[2]]
# [1] "C" "D"