【问题标题】:add identifier to each row of dataframe before/after use ldpy to combine list of dataframes into one在使用 ldpy 将数据帧列表合并为一个之前/之后为每一行数据帧添加标识符
【发布时间】:2012-04-02 10:38:20
【问题描述】:

我有基于此one 的后续问题。

我使用df <- ldply(listOfDataFrames, data.frame)将12000+个数据框的列表合并为一个,但是由于列表中的每个数据框都没有标识符,我需要知道哪个数据框来自哪个列表。

我知道我可以使用ldply(test,nrow)创建另一个数据框,然后使用for-loop添加列表名称,但似乎有点慢,不知道有没有更快的方法。谢谢。

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    我没有适合你的 plyr 解决方案,但我通常在 base R 中这样做。

    > a <- list(data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5), b=runif(5)))
    > a
    [[1]]
              a         b
    1 0.2994804 0.2681471
    2 0.3223587 0.3663688
    3 0.2662296 0.2941038
    4 0.8041538 0.2991932
    5 0.6860321 0.0872916
    
    [[2]]
               a          b
    1 0.84966749 0.01750988
    2 0.19320093 0.05274077
    3 0.63218616 0.77222663
    4 0.00773626 0.53163878
    5 0.19965884 0.50740204
    
    [[3]]
              a          b
    1 0.2915164 0.65905466
    2 0.5676906 0.01094598
    3 0.5689014 0.58943383
    4 0.7937997 0.75535177
    5 0.2304010 0.84012697
    
    > indices <- lapply(a, nrow)
    > a.all <- do.call(rbind, a)
    > a.all$index <- rep(1:length(a), indices)
    > a.all
                a          b index
    1  0.29948042 0.26814714     1
    2  0.32235868 0.36636880     1
    3  0.26622956 0.29410382     1
    4  0.80415381 0.29919316     1
    5  0.68603208 0.08729160     1
    6  0.84966749 0.01750988     2
    7  0.19320093 0.05274077     2
    8  0.63218616 0.77222663     2
    9  0.00773626 0.53163878     2
    10 0.19965884 0.50740204     2
    11 0.29151644 0.65905466     3
    12 0.56769063 0.01094598     3
    13 0.56890138 0.58943383     3
    14 0.79379972 0.75535177     3
    15 0.23040098 0.84012697     3
    

    【讨论】:

      【解决方案2】:

      我猜您也可以使用reshape2。我通常使用melt

      library(reshape2)
      #Thanks Roman
      a <- list(data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5), b=runif(5)))
      melt(a)
      
      > melt(a, id.vars = 1:2)
                a        b L1
      1  0.325542 0.914199  1
      2  0.947871 0.719881  1
      3  0.683925 0.574832  1
      4  0.715612 0.646920  1
      ...
      

      【讨论】:

        【解决方案3】:

        同样,使用 base R,您可以命名列表项:

        # Also thank you Roman
        a <- list(data.frame(a=runif(5), b=runif(5)), data.frame(a=runif(5),
          b=runif(5)), data.frame(a=runif(5), b=runif(5)))
        names(a)<-seq_along(a)
        
        myAns<-do.call("rbind",a)
        

        那么行名对应列表项的名称。

        row.names(myAns)
        

        【讨论】:

          猜你喜欢
          • 2016-01-31
          • 1970-01-01
          • 2022-12-07
          • 2020-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-31
          相关资源
          最近更新 更多