Реорганизация списков data.frames - PullRequest
4 голосов
/ 06 мая 2011

Допустим, у меня есть список фреймов данных.Где у каждого фрейма данных есть столбцы, подобные этому:

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 ]

7 голосов
/ 06 мая 2011

Brandon

Вы можете использовать параметр | в cast для создания списков. Использование data.frame из @Wojciech:

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

cast(dat.m, L1 ~ variable | company)
3 голосов
/ 06 мая 2011

Вот способ использования пакета plyr: начните с @ wojciech's 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 голосов
/ 06 мая 2011

Пример данных

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...