2014-12-11 16 views
5

मैं कई कारकों से कई चर से डेटा सारांशित करने के लिए ddply का उपयोग करना चाहता हूं।आर ddply लूपिंग; कई कारक

site block plot rep name weight height dtf 
Alberta 1 2 1 A 43 139 54 
Alberta 2 5 2 A 46 139 46 
Alberta 4 10 3 A 49 136 54 
Nunavut 1 1 1 A 49 136 59 
Nunavut 2 4 2 A 51 135 50 
Nunavut 3 8 3 A 52 133 56 
Alberta 5 13 1 B 55 132 50 
Alberta 4 12 2 B 55 125 46 
Alberta 5 15 3 B 56 120 46 
Nunavut 5 14 1 B 57 119 54 
Nunavut 5 13 2 B 58 119 55 
Nunavut 4 11 3 B 59 118 51 
... 

और इतने पर:

मैं निम्नलिखित परीक्षण डेटा है।

मैं चर "वजन", "ऊंचाई", "डीटीएफ" चर लेना चाहता हूं, और कारकों "साइट" और "नाम" के अनुसार उन्हें सारांशित करना चाहता हूं।

मैं स्तंभ नाम के वैक्टर के साथ शुरू किया:

data.factors <- NULL 
data.variables <- NULL 
for(n in 1:length(data)){if(is.factor(data[[n]])){ data.factors <- c(data.factors,colnames(data[n]))} else next} 
for(n in 1:length(data)){if(is.numeric(data[[n]]) || is.integer(data[[n]])){ data.variables <- c(data.variables,colnames(data[n]))} else next} 

यह कई एकल कारक anovas प्रदर्शन के लिए काम किया:

for(variables in data.variables){ 
for(factors in data.factors){ 
output1 <- aov(lm(data[[variables]]~data[[factors]])) 
cat(variables) 
cat(" by ") 
cat(factors) 
cat("\n") 
print(summary(output1)) 
}} 

लेकिन मैं इसे ddply के साथ काम करने के लिए नहीं मिल सकता है।

site name N min max mean sd se 
1 Alberta A 1 weight weight NA NA NA 
2 Alberta B 1 weight weight NA NA NA 
3 Alberta C 1 weight weight NA NA NA 
4 Alberta D 1 weight weight NA NA NA 
5 Alberta E 1 weight weight NA NA NA 
6 Nunavut A 1 weight weight NA NA NA 
7 Nunavut B 1 weight weight NA NA NA 
8 Nunavut C 1 weight weight NA NA NA 
9 Nunavut D 1 weight weight NA NA NA 
10 Nunavut E 1 weight weight NA NA NA 
.... 

थे मैं ddply एक एकल चर (सीधे बजाय कि के माध्यम से "x" संदर्भित में टाइप) यह ठीक काम करेगा इसका परीक्षण करना:

for (x in data.variables){ 
variable.summary <- ddply(data, .(site,name), summarise, 
N = sum(!is.na(x[1])), 
min = min(x[1], na.rm=TRUE), 
max = max(x[1], na.rm=TRUE), 
mean = mean(x[1], na.rm=TRUE), 
sd = sd(x[1], na.rm=TRUE), 
se = sd/sqrt(N) 
) 
print(variable.summary) 
} 

सभी मैं पीछा कर रहा है।

क्या संदर्भित कॉलम आईडी को पहचानने के लिए फ़ंक्शन प्राप्त करने की कोई चाल है? मैं PERL करने के लिए इस्तेमाल कर रहा हूँ, अपने $ Scalars कि कहीं भी संदर्भित किया जा सकता है, और उम्मीद कर रही थी इसी तरह की प्रणाली आर

उत्तर

0

में उपलब्ध था data.table साथ प्रयास करें: कर सकते हैं

> testdt = data.table(testdf) 
> testdt[,list(meanwt=mean(weight),meanht=mean(height)),by=list(site,name)] 
     site name meanwt meanht 
1: Alberta A 46.00000 138.0000 
2: Nunavut A 50.66667 134.6667 
3: Alberta B 55.33333 125.6667 
4: Nunavut B 58.00000 118.6667 

अधिकतम, न्यूनतम आदि फ़ंक्शन सूची में जोड़ा जाए।

3

ddply के उत्तराधिकारी, dplyr, पाश कुछ भी करने की कोई जरूरत के साथ वास्तव में आसानी से group_by() और summarise_each() का उपयोग कर ऐसा कर सकते हैं,:

df <- data.frame(site = c("Alberta", "Alberta", "Alberta", "Nunavut", "Nunavut", "Nunavut", "Alberta", "Alberta", "Alberta", "Nunavut", "Nunavut", "Nunavut"), 
       block = c(1, 2, 4, 1, 2, 3, 5, 4, 5, 5, 5, 4), 
       plot = c(2, 5, 10, 1, 4, 8, 13, 12, 15, 14, 13, 11), 
       rep = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3), 
       name = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B"), 
       weight = c(43, 46, 49, 49, 51, 52, 55, 55, 56, 57, 58, 59), 
       height = c(139, 139, 136, 136, 135, 133, 132, 125, 120, 119, 119, 118), 
       dtf = c(54, 46, 54, 59, 50, 56, 50, 46, 46, 54, 55, 51)) 

library(dplyr) 

df.summary <- df %>% 
    group_by(site, name) %>% 
    summarise_each(funs(sum, min, max, mean, sd), weight, height, dtf) 

कौन इस तरह एक डेटा फ्रेम में परिणाम:

> df.summary 
Source: local data frame [4 x 17] 
Groups: site 

    site name weight_length height_length dtf_length weight_min height_min dtf_min 
1 Alberta A    3    3   3   43  136  46 
2 Alberta B    3    3   3   55  120  46 
3 Nunavut A    3    3   3   49  133  50 
4 Nunavut B    3    3   3   57  118  51 
Variables not shown: weight_max (dbl), height_max (dbl), dtf_max (dbl), weight_mean (dbl), 
    height_mean (dbl), dtf_mean (dbl), weight_sd (dbl), height_sd (dbl), dtf_sd (dbl) 

आप funs()summarise_each के अंदर किसी भी फ़ंक्शन को पास कर सकते हैं, इसलिए यदि आप मानक त्रुटियों के लिए कॉलम चाहते हैं, तो बस पहले कार्य करें:

se <- function(x) { 
    N <- sum(!is.na(x[1])) 
    return(sd/sqrt(N)) 
} 

और इसे पास करें: summarise_each(funs(sum, min, max, mean, sd, se)...)

संबंधित मुद्दे