重新组织数据框列表

4

假设我有一个数据框列表,每个数据框都有以下列:

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) 

但这只能一次处理一个。有更短的方法吗?

这些是列名吗? - Vincent
在现有的列表中:公司、x、y、z是列名。 - Brandon Bertelsen
为什么不将所有数据存储在一个数据框中? - hadley
这很令人惊讶,除非你有数百万行数据。在R中进行子集操作非常快。 - hadley
@Hadley,不幸的是,数据操作并不是我在这些列出的数据框中运行的唯一任务。尽管如此,我已经开始欣赏使用帧列表来帮助我识别和隔离我正在处理的内容。 - Brandon Bertelsen
显示剩余3条评论
3个回答

7

Brandon,

您可以在cast中使用|参数来创建列表。使用@Wojciech的数据框:

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

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

3

这里有一种使用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

2

示例数据

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接