【问题标题】:Spliting a list of lists into sublists将列表列表拆分为子列表
【发布时间】:2013-11-13 17:09:18
【问题描述】:

考虑以下(简单)列表:

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 方法有关,但我无法使其工作。

谢谢,

【问题讨论】:

    标签: r list split


    【解决方案1】:
    ## 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"
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 感谢您的评论。但是我收到以下错误:&gt; test = split(do.call(c, big_lst), 1:2) Error in do.call(c, big_lst) : 'what' must be a character string or a function
      • 您的工作区中可能有一个名为c 的变量,请将c 替换为base::c'c'
      • 非常感谢。有用。但是我怎样才能访问子狭缝呢?
      • @Mariam ... ?带括号?
      • 对不起,我不是这个意思,但我想通了。谢谢!
      猜你喜欢
      • 2011-03-28
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2010-09-29
      相关资源
      最近更新 更多