【问题标题】:how to merge the elements of a list into a data frame? in R [duplicate]如何将列表的元素合并到数据框中?在 R [重复]
【发布时间】:2013-03-24 20:13:56
【问题描述】:

我有一个元素列表,像这样

[[1]]
[1] 9.623571 5.334566 7.266597 6.510794 4.301958

[[2]]
[1] 9.693326 9.015892 1.266178 8.547392 4.326199

我想把它转换成这样的数据框:

V1       V2       V3       V4       V5
9.623571 5.334566 7.266597 6.510794 4.301958
9.693326 9.015892 1.266178 8.547392 4.326199

因此,列表条目内相同位置的所有元素,合并到同一列中。

它必须是与“rbind”相关的东西,因为结果就像在做:

rbind(list[[1]],list[[2]]...)

但我不知道如何将它应用于列表的所有条目。对此的任何说明将不胜感激。

非常感谢您。

蒂娜。

【问题讨论】:

  • @thelatemail,相同的解决方案,不同的问题。
  • @RicardoSaporta - 我很难从快速搜索中找到完美的副本,但我认为它足够接近,几乎可以认为是相同的。
  • 哈哈,这难道不是打开它的完美理由吗?这个想法是有人搜索会很快找到他们需要的答案然后继续前进。

标签: r list dataframe


【解决方案1】:

因为还没有人提到这个:

 library(data.table)
 rbindlist(yourList)

非常快。

【讨论】:

    【解决方案2】:

    试试这个:

    as.data.frame(do.call(rbind, l))
    

    在哪里,l <- list(1:5, 6:10)

    #   V1 V2 V3 V4 V5
    # 1  1  2  3  4  5
    # 2  6  7  8  9 10
    

    【讨论】:

    • +1 这比我的解决方案更整洁
    【解决方案3】:

    我知道这使用了一个额外的包,但我的路径中通常有 plyrreshape2

    library(plyr)
    x <- list( sample(1:10,10) , sample(1:10,10))
    ldply(x) # list 2 data.frame
    
      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
    1  3  8  6  2 10  9  7  5  1   4
    2  8 10  3  4  2  5  1  7  6   9
    

    当列表有名称时,我发现它特别有用:

    names(x) <- c("hello","goodbye")
    ldply(x) 
    
          .id V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
    1   hello  3  8  6  2 10  9  7  5  1   4
    2 goodbye  8 10  3  4  2  5  1  7  6   9
    

    使用 reshape2,您还可以快速将 data.frame 重塑为可以使用 ggplot2 快速绘制的东西

    library(reshape2)
    melt(ldply(x),c(".id"))
    
           .id variable value
    1    hello       V1     3
    2  goodbye       V1     8
    3    hello       V2     8
    4  goodbye       V2    10
    5    hello       V3     6
    6  goodbye       V3     3
    7    hello       V4     2
    8  goodbye       V4     4
    9    hello       V5    10
    10 goodbye       V5     2
    11   hello       V6     9
    12 goodbye       V6     5
    13   hello       V7     7
    14 goodbye       V7     1
    15   hello       V8     5
    16 goodbye       V8     7
    17   hello       V9     1
    18 goodbye       V9     6
    19   hello      V10     4
    20 goodbye      V10     9
    

    对于非常大的数据集(未经测试的假设),这些解决方案都不是特别快,但它们在处理小数据集(

    【讨论】:

      【解决方案4】:

      使用sapply 来获得你想要的东西。举个例子……

      x <- list( 1:10 , letters[1:10])
      as.data.frame( t( sapply(x , rbind) ) )
      
      #     V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
      #   1  1  2  3  4  5  6  7  8  9  10
      #   2  a  b  c  d  e  f  g  h  i   j
      

      【讨论】:

        【解决方案5】:

        Reducerbind 列表的元素一起使用:

        l <- list (a=c(9.623571, 5.334566, 7.266597, 6.510794, 4.301958),
                   b=c(9.693326, 9.015892, 1.266178, 8.547392, 4.326199))
        # rbind the elements of the list.
        Reduce(rbind, l)
        

        【讨论】:

        • Reduce 在大型列表中非常很慢。试试看。
        猜你喜欢
        • 2016-08-14
        • 1970-01-01
        • 2021-06-19
        • 2014-12-21
        • 2013-11-26
        • 1970-01-01
        • 2014-06-08
        • 2021-04-11
        • 1970-01-01
        相关资源
        最近更新 更多