【问题标题】:Reorganizing Lists of data.frames重组 data.frames 列表
【发布时间】:2011-08-19 21:17:39
【问题描述】:

假设我有一个数据框列表。每个数据框都有这样的列:

lists$a
company, x, y ,z
lists$b 
company, x, y, z
lists$c
company, x, y, z

关于我的意思的任何想法将其更改为:

new.list$company
a,x,y,z
b,x,y,z
c,x,y,z
new.list$company2
a,x,y,z
b,x,y,z
c,x,y,z 

我一直在使用:

new.list[[company]] <- ldply(lists, subset, company=company.name) 

但这一次只做一个。有没有更短的方法?

【问题讨论】:

  • 这些是列名还是什么?
  • 现有列表中:company、x、y、z为colnames。
  • 为什么不将它们全部存储在一个数据框中?
  • @Hadley,从技术上讲我可以,但是在将几年的数据压缩到同一个数据框中之后它变得太大(而且速度很慢),我可以快速访问我需要的部分,而不是而不是必须处理整个集合。
  • 除非您拥有数百万行数据,否则这太令人惊讶了。 r中的子集化非常快

标签: r


【解决方案1】:

布兰登,

您可以使用cast 中的| 参数来创建列表。使用来自@Wojciech 的data.frame:

require(reshape)
dat.m <- melt(dat_1, "company")

cast(dat.m, L1 ~ variable | company)

【讨论】:

    【解决方案2】:

    这是使用plyr 包的一种方法:从@wojciech 的dat_l 开始,然后使用ldply 将整个内容放在一个数据框中:

    require(plyr)
    df <- ldply(dat_l)
    

    然后通过在company 列上拆分将其转回列表:

    new_list <- dlply(df, .(company), subset,  select = c(.id,x,y,z) )
    
    > new_list[1:3]
    $C
       .id x         y          z
    3    a 3 0.7209484  1.6247163
    35   i 3 0.1630658  0.2158516
    37   j 1 0.8779915 -0.9371671
    
    $G
       .id x         y          z
    2    a 2 0.1132311 -1.8067876
    10   c 2 0.1825166  1.8355509
    28   g 4 0.6474877 -0.8052137
    
    $H
       .id x         y         z
    1    a 1 0.9562020 -1.450522
    25   g 1 0.1322886  0.584342
    

    【讨论】:

      【解决方案3】:

      示例数据

      dat_l <- lapply(1:10,function(x) data.frame(x=1:4,y=rexp(4),
                                                   z=rnorm(4),company=sample(LETTERS,4)))
      names(dat_l) <- letters[1:10]
      

      代码

      Nrec <- unlist(lapply(dat_l,nrow))
      dat <- do.call(rbind,dat_l)
      dat$A <- rep(names(Nrec),Nrec)
      dat_new <- split(dat[-4],dat$company)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 2015-05-08
        • 2020-06-09
        • 2021-03-16
        • 1970-01-01
        相关资源
        最近更新 更多