重新组织data.frames列表

时间:2011-05-06 04:15:00

标签: r

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

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) 

但这只能一次做一个。有更短的方式吗?

3 个答案:

答案 0 :(得分:7)

布兰登,

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

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

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

答案 1 :(得分: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 :(得分: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)