2012-09-12 23 views
7

Veri çerçevesinin alt kümeleri için sütun araçları almak için R'nin by komutunu kullanıyorum.R'nin "by" komutunun çıktısını veri çerçevesine dönüştürme

> by(z[,2:5],z$labels,colMeans) 
z[, 1]: a 
data.1 data.2 data.3 data.4 
    1.5 6.5 11.5 16.5 
------------------------------------------------------------ 
z[, 1]: b 
data.1 data.2 data.3 data.4 
    3  8  13  18 
------------------------------------------------------------ 
z[, 1]: c 
data.1 data.2 data.3 data.4 
    4.5 9.5 14.5 19.5 

Ama verilere geri çıkışını zorlamak nasıl:

> z = data.frame(labels=c("a","a","b","c","c"),data=matrix(1:20,nrow=5)) 
> z 
    labels data.1 data.2 data.3 data.4 
1  a  1  6  11  16 
2  a  2  7  12  17 
3  b  3  8  13  18 
4  c  4  9  14  19 
5  c  5  10  15  20 

Ben sütun almak için R'ın by komutunu kullanabilirsiniz etiketleri sütuna göre şu anlama gelir: Örneğin, bu veri çerçevesini dikkate çerçeveye? as.data.frame

> as.data.frame(by(z[,2:5],z$labels,colMeans)) 
Error in as.data.frame.default(by(z[, 2:5], z$labels, colMeans)) : 
    cannot coerce class '"by"' into a data.frame 

cevap

11

Sen reshape2 paketinden

library(plyr) 
ddply(z, .(labels), numcolwise(mean)) 
    labels data.1 data.2 data.3 data.4 
1  a 1.5 6.5 11.5 16.5 
2  b 3.0 8.0 13.0 18.0 
3  c 4.5 9.5 14.5 19.5 

Ya aggregatestats

aggregate(z[,-1], by=list(z$labels), mean) 
    Group.1 data.1 data.2 data.3 data.4 
1  a 1.5 6.5 11.5 16.5 
2  b 3.0 8.0 13.0 18.0 
3  c 4.5 9.5 14.5 19.5 

Ya dcast den plyr paketinden ddply kullanabilirsiniz ... çalışmıyor

library(reshape2) 
dcast(melt(z), labels ~ variable, mean) 

sapply kullanma:

t(sapply(split(z[,-1], z$labels), colMeans)) 
    data.1 data.2 data.3 data.4 
a 1.5 6.5 11.5 16.5 
b 3.0 8.0 13.0 18.0 
c 4.5 9.5 14.5 19.5 
+0

Harika! Tüm bunlar benim aradığım şeyi yapıyordu, ancak 'toplam' en basit gibi görünüyor (ve gelecekte tekrar anlamaya en kolay olanı). Teşekkürler! – Andrew

8

by çıktısı list nedenle bunları rbind için do.call kullanmak ve daha sonra bu dönüştürebilirsiniz geçerli:

as.data.frame(do.call("rbind",by(z[,2:5],z$labels,colMeans))) 
    data.1 data.2 data.3 data.4 
a 1.5 6.5 11.5 16.5 
b 3.0 8.0 13.0 18.0 
c 4.5 9.5 14.5 19.5 
0

tarafından çıkışı ile başa çıkmak can gerçekten sinir bozucu ol. Ne istediğinizi bir veri çerçevesinin biçiminde çekmek için bir yol buldum ve ekstra paketlere ihtiyacınız olmayacak.

Yani, bunu yaparsanız bu:

aux <- by(z[,2:5],z$labels,colMeans) 

Daha sonra bunu bir veri çerçevesi içinde dönüştürebilir: Sadece aux tüm satırlar ve sütunlar alıyorum

aux_df <- as.data.frame(t(aux[seq(nrow(aux)),seq(ncol(aux))])) 

transpoze etmek ve as.data.frame kullanarak.

Umarım bu yardımcı olur.

İlgili konular