2013-05-20 16 views
17

मैं इस तरह एक dataframe है:सशर्त

experiment iter results 
    A  1  30.0 
    A  2  23.0 
    A  3  33.3 
    B  1  313.0 
    B  2  323.0 
    B  3  350.0 
.... 

वहाँ की स्थिति के साथ एक समारोह लगाने से परिणाम हिसाब करने के लिए रास्ता नहीं है। उपर्युक्त उदाहरण में, यह शर्त एक विशेष प्रयोग के सभी पुनरावृत्तियों है।

A sum of results (30 + 23, + 33.3) 
B sum of results (313 + 323 + 350) 

मैं "लागू" फ़ंक्शन के बारे में सोच रहा हूं, लेकिन इसे काम करने के लिए कोई रास्ता नहीं मिल रहा है।

उत्तर

43

ऐसा करने के लिए बहुत सारे विकल्प हैं। ध्यान दें कि यदि आप किसी अन्य समारोह sum से अलग में रुचि रखते हैं, तो बस तर्क FUN=any.function आदि बदलने के लिए, उदा, अगर आप mean, varlength चाहते हैं, है, तो बस FUN तर्क, उदा, FUN=mean, FUN=var और इतने पर में उन कार्यों प्लग। आइए कुछ विकल्पों का पता लगाएं:

aggregate आधार पर कार्य।

> aggregate(results ~ experiment, FUN=sum, data=DF) 
    experiment results 
1   A 86.3 
2   B 986.0 

या हो सकता है tapply?

> with(DF, tapply(results, experiment, FUN=sum)) 
    A  B 
86.3 986.0 

plyr पैकेज

> # library(plyr) 
> ddply(DF[, -2], .(experiment), numcolwise(sum)) 
    experiment results 
1   A 86.3 
2   B 986.0 

> ## Alternative syntax 
> ddply(DF, .(experiment), summarize, sumResults = sum(results)) 
    experiment sumResults 
1   A  86.3 
2   B  986.0 

इसके अलावा dplyr पैकेज से

इसके अलावा ddply

> require(dplyr) 
> DF %>% group_by(experiment) %>% summarise(sumResults = sum(results)) 
Source: local data frame [2 x 2] 

    experiment sumResults 
1   A  86.3 
2   B  986.0 

sapply और split का उपयोग कर tapply के बराबर।

> with(DF, sapply(split(results, experiment), sum)) 
    A  B 
86.3 986.0 

आप समय के बारे में चिंता कर रहे हैं, data.table अपने दोस्त है:

> # library(data.table) 
> DT <- data.table(DF) 
> DT[, sum(results), by=experiment] 
    experiment V1 
1:   A 86.3 
2:   B 986.0 

इतना लोकप्रिय नहीं है, लेकिन डोबी पैकेज अच्छा (aggregate के बराबर है, यहां तक ​​कि वाक्य रचना में!)

> # library(doBy) 
> summaryBy(results~experiment, FUN=sum, data=DF) 
    experiment results.sum 
1   A  86.3 
2   B  986.0 

इसके अलावा by इस स्थिति

> (Aggregate.sums <- with(DF, by(results, experiment, sum))) 
experiment: A 
[1] 86.3 
------------------------------------------------------------------------- 
experiment: B 
[1] 986 

में आपकी मदद करता है नतीजा एक मैट्रिक्स तो उपयोग करना चाहते हैं या तो cbind या rbind

> cbind(results=Aggregate.sums) 
    results 
A 86.3 
B 986.0 

sqldf sqldf पैकेज से भी एक अच्छा विकल्प

> library(sqldf) 
> sqldf("select experiment, sum(results) `sum.results` 
     from DF group by experiment") 
    experiment sum.results 
1   A  86.3 
2   B  986.0 

xtabs भी काम करता है (केवल जब FUN=sum)

> xtabs(results ~ experiment, data=DF) 
experiment 
    A  B 
86.3 986.0 
+8

+1 यह उससे कहीं अधिक व्यापक नहीं मिलता है हो सकता है ... –