2013-01-21 22 views
5

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

#create test dfs 
    df1<-data.frame(a=sample(1:50,10),b=sample(1:50,10),c=sample(1:50,10),d=(c("a","b","c","a","a","b","b","a","c","d"))) 
    df2<-data.frame(a=sample(1:50,9),b=sample(1:50,9),c=sample(1:50,9),d=(c("e","f","g","e","e","f","f","e","g"))) 
    df3<-data.frame(a=sample(1:50,8),b=sample(1:50,8),c=sample(1:50,8),d=(c("h","i","j","h","h","i","i","h"))) 

    #make them a list 
    list.1<-list(df1=df1,df2=df2,df3=df3) 

मैं प्रत्येक समूह के प्रत्येक dataframe की घ में परिभाषित की संकरी गणना करने के लिए करना चाहते हैं: तो follwing डेटा दिया। अगर मैं plyr केवल एक dataframe पर एक संभावना का उपयोग करने का उपयोग करें (समूहों द्वारा एक विशिष्ट स्तंभ द्वारा मतलब गणना करने के लिए) चाहते हैं plyr पैकेज होगा:

ddply(df1,.(d),summarise, mean=mean(a)) 

लेकिन कैसे मैं के भीतर हर स्तंभ पर इसे लागू करना डेटाफ्रेम और सूची में प्रत्येक डेटाफ्रेम पर? और मैं सभी डेटा को कैसे पुनः प्राप्त कर सकता हूं ताकि अंत में मुझे परिणाम प्राप्त करने वाले मैट्रिज़ के साथ एक सूची मिल जाएगी? इस बहुत ही बुनियादी सवाल के लिए खेद है, लेकिन मैं आर के लिए नया हूं और मैं वास्तव में कुछ समय के लिए इसे हल करने की कोशिश कर रहा हूं ... thx।

उत्तर

1

यहां llply() और ddply() संयोजन का एक समाधान है। सबसे पहले, llply() सूची के प्रत्येक तत्व पर फ़ंक्शन लागू करेगा और एक सूची वापस करेगा। फिर ddply() सूची के प्रत्येक डेटा फ्रेम पर लागू होता है और प्रत्येक डेटा फ्रेम को कॉलम d के अनुसार विभाजित करता है। फ़ंक्शन colMeans() प्रत्येक संख्यात्मक कॉलम के लिए औसत मान की गणना करने के लिए उपयोग किया जाता है।

llply(list.1,function(x) ddply(x,.(d),function(x) colMeans(x[,1:3]))) 
$df1 
    d  a  b  c 
1 a 22.25000 26.25 34.25000 
2 b 19.66667 22.00 28.66667 
3 c 37.00000 44.50 18.00000 
4 d 17.00000 3.00 4.00000 

$df2 
    d  a  b c 
1 e 20.50000 32.25000 18.5 
2 f 25.33333 34.33333 21.0 
3 g 20.50000 26.50000 16.5 

$df3 
    d a  b  c 
1 h 17.5 26.50000 37.25000 
2 i 45.0 22.33333 26.33333 
3 j 25.0 33.00000 42.00000 
+0

सही और प्रयोग करने में आसान। यही वह था जो मैं सोच रहा था लेकिन मुझे नहीं पता कि ऑब्जेक्ट को ddply के अंदर कैसे नामित किया जाए। इस तरह यह अब काम करता है! धन्यवाद। – Joschi

3

आप एक बड़ा data.frame में सभी डेटा रखना होगा:

library(reshape) 

big_dataframe = ldply(list.1, function(x) melt(x, id.vars = "d")) 
> head(big_dataframe) 
    .id d variable value 
1 df1 a  a 44              
2 df1 b  a 17              
3 df1 c  a 15              
4 df1 a  a 30              
5 df1 a  a 49              
6 df1 b  a 33 

... और फिर उस पर ddply का उपयोग करें।

res = ddply(big_dataframe, .(.id, d, variable), summarise, mn = mean(value)) 
> res 
    .id d variable  mn 
1 df1 a  a 40.00000             
2 df1 a  b 25.25000             
3 df1 a  c 31.25000             
4 df1 b  a 22.66667             
5 df1 b  b 16.00000             
6 df1 b  c 26.00000             
7 df1 c  a 9.00000             
8 df1 c  b 16.50000             
9 df1 c  c 15.00000             
10 df1 d  a 28.00000             
11 df1 d  b 24.00000             
12 df1 d  c 39.00000             
13 df2 e  a 18.50000             
14 df2 e  b 15.50000             
15 df2 e  c 16.50000             
16 df2 f  a 26.33333             
17 df2 f  b 42.00000             
18 df2 f  c 37.00000             
19 df2 g  a 26.50000             
20 df2 g  b 22.00000             
21 df2 g  c 31.00000             
22 df3 h  a 29.25000             
23 df3 h  b 34.25000             
24 df3 h  c 32.00000             
25 df3 i  a 30.33333             
26 df3 i  b 40.00000             
27 df3 i  c 24.33333             
28 df3 j  a 21.00000             
29 df3 j  b 5.00000             
30 df3 j  c 46.00000 

जो प्रत्येक चर (a-c) के माध्य देता है, कारक d के स्तर प्रति, और प्रति उप dataframe (DF1-DF3)।

3

आप कर सकते हैं हमेशा बस lapply अपने ddply:

lapply(list.1, function(x) ddply(x, .(d), function(x) 
          data.frame(a=mean(x$a),b=mean(x$b),c= mean(x$c)))) 

या वास्तव में अपने कोड का उपयोग:

lapply(list.1, function(x) ddply(x,.(d),summarise, mean=mean(a))) 
+0

धन्यवाद। यही वह है जो मैं सोच रहा था लेकिन मुझे नहीं पता कि ऑब्जेक्ट को डीडीपीई में कैसे नामित किया जाए। यह सब अब अंदर के समारोह के साथ समझ में आता है ... मुझे लगता है कि पहला कोड अंत में याद करता है)। यह ठीक काम करता है लेकिन मुझे मैन्युअल रूप से सभी कॉलम इंडेक्स करना होगा। डाउनर कोड केवल एक के लिए साधन देता है। – Joschi