【问题标题】:Combine list of vectors to a data.frame, with list number将向量列表组合到 data.frame 中,并带有列表编号
【发布时间】:2013-09-26 18:05:09
【问题描述】:

我们有一个向量列表(不同长度的):

foo <- list(1:3,NULL,2:7)

我们需要的是一个包含两列的data.frame:项目和列表编号,如下所示:

data.frame(Item=c(1:3,2:7), List=c(1,1,1,3,3,3,3,3,3))

这里Item 列是foo 中项目的向量,List 列显示每个项目属于foo 的哪个列表。

这可以像下面这样完成:

data.frame(Item=unlist(foo), 
           List=unlist(lapply(seq_along(foo), function(i) rep(i, length(foo[[i]])))))

但我正在寻找更有创意和更有效的解决方案。你有更好的想法吗?

【问题讨论】:

    标签: r list vector dataframe


    【解决方案1】:

    我愿意:

    data.frame(Item = unlist(foo),
               List = rep(seq_along(foo), sapply(foo, length)))
    

    sapply(foo, length) 替换为vapply(foo, length, integer(1))unlist(lapply(foo, length)) 也会更高效一些。而且我认为你不能走得更快。

    效率较低但有点创意的是:

    i <- sapply(foo, Negate(is.null))
    do.call(rbind, Map(data.frame, Item = foo[i], List = seq_along(foo)[i]))
    

    【讨论】:

    • +1 表示备选方案。我想我们几乎在同一时间发布了我们的sapply 替代方案。
    【解决方案2】:

    这个答案取决于“foo”中的数据类型,但你可以在将names 添加到list 后尝试stack

    names(foo) <- seq_along(foo)
    stack(foo)
    #   values ind
    # 1      1   1
    # 2      2   1
    # 3      3   1
    # 4      2   3
    # 5      3   3
    # 6      4   3
    # 7      5   3
    # 8      6   3
    # 9      7   3
    # Warning message:
    #   In stack.default(foo) : non-vector elements will be ignored
    

    您当前方法的稍微更紧凑的版本是使用sapply 而不是lapply

    > foo <- list(1:3,NULL,2:7)
    > data.frame(Item = unlist(foo), List = rep(seq_along(foo), sapply(foo, length)))
    

    【讨论】:

      【解决方案3】:

      使用plyr,您可以获得更易读的解决方案:

      library(plyr)
      ldply(seq_along(foo),
             function(x)data.frame(Item=foo[[x]],
                                   List=rep(x,length(foo[[x]]))))
      
       Item List
      1    1    1
      2    2    1
      3    3    1
      4    2    3
      5    3    3
      6    4    3
      7    5    3
      8    6    3
      9    7    3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2021-03-12
        • 2020-12-24
        • 2012-02-13
        • 1970-01-01
        • 2020-06-21
        相关资源
        最近更新 更多