将列表列表拆分为子列表

时间:2013-11-13 17:09:18

标签: r list split

考虑以下(简单)列表列表:

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有关,但我无法使其发挥作用。

谢谢,

2 个答案:

答案 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"