2012-09-12 14 views
7

पर आर के "बाय" कमांड के आउटपुट को कनवर्ट करना मैं डेटा फ्रेम के सबसेट के लिए कॉलम साधन प्राप्त करने के लिए आर के by कमांड का उपयोग करने की कोशिश कर रहा हूं।डेटा के फ्रेम

> 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 

लेकिन यह कैसे मैं एक डेटा वापस करने के लिए उत्पादन विवश करते हैं:

> 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 

मैं आर के by आदेश का उपयोग कर सकते हैं स्तंभ पाने के लिए लेबल स्तंभ के अनुसार अर्थ है: उदाहरण के लिए, इस डेटा फ्रेम पर विचार फ्रेम? 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 

उत्तर

11

आप ddplyplyr पैकेज से

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 

या 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 

या dcast से reshape2 पैकेज से उपयोग कर सकते हैं

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

का उपयोग sapply:

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

बढ़िया! सब कुछ जो मैं खोज रहा था, हालांकि 'कुल' सरलता की तरह लगता है (और भविष्य में फिर से पता लगाने के लिए मेरे लिए सबसे सरल)। धन्यवाद! – Andrew

8

by के उत्पादन में एक list ताकि आप rbind करने के लिए उन्हें do.call का उपयोग करें और फिर परिवर्तित इस सकता है:

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

उत्पादन से निपटने के साथ कर सकते हैं वास्तव में कष्टप्रद हो। मुझे डेटा फ्रेम के प्रारूप में जो भी चाहिए, उसे वापस लेने का एक तरीका मिला है और आपको अतिरिक्त पैकेज की आवश्यकता नहीं होगी।

तो, अगर आप इस:

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

फिर आप ऐसा करने से एक डेटा फ्रेम में यह बदल सकता है:

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

मैं सिर्फ aux से सभी पंक्तियों और स्तंभों हो रही है , इसे transposing और as.data.frame का उपयोग कर।

मुझे उम्मीद है कि इससे मदद मिलती है।