0

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

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

谢谢,

4

2 回答 2

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"
于 2013-11-13T17:17:14.043 回答
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
于 2013-11-13T17:14:42.090 回答