2013-05-21 15 views
8

Mam następujące dane:Mean zmiennej przez dwa czynniki

a <- c(1,1,1,1,2,2,2,2) 
b <- c(2,4,6,8,2,3,4,1) 
c <- factor(c("A","B","A","B","A","B","A","B")) 
df <- data.frame(
    sp=a, 
    length=b, 
    method=c) 

mogę użyć następujących dostać rachunek liczby próbek z każdego gatunku metodą:

n <- with(df,tapply(sp,method,function(x) count(x))) 

Jak czy otrzymam również średnią długość według metody dla każdego gatunku?

+1

przy okazji tylko po to, aby zaoszczędzić trochę pisania 'z (df, tapply (sp, metoda, licznik))" działałoby dobrze w twoim przykładzie. –

Odpowiedz

9

Osobiście używam aggregate:

aggregate(length ~ sp, data = df, FUN= "mean") 
# by species only 
#  sp length 
#1 1 5.0 
#2 2 2.5 

aggregate(length ~ sp + method, data = df, FUN= "mean") 
    # by species and method 
# sp method length 
#1 1  A  4 
#2 2  A  3 
#3 1  B  6 
#4 2  B  2 

za wszystko razem może chcesz:

aggregate(length ~ method, data = df, function(x) c(m = mean(x), counts = length(x))) 

# counts and mean for each method 
# method length.m length.counts 
#1  A  3.5   4.0 
#2  B  4.0   4.0 
5

plyr biblioteka jest bardzo pomocne dla rzeczy jak ten

library(plyr) 
new.df <- ddply(df, c("method", "sp"), summarise, 
       mean.length=mean(length), 
       max.length=max(length), 
       n.obs=length(length)) 

daje

> new.df 
    method sp mean.length max.length n.obs 
1  A 1   4   6  2 
2  A 2   3   4  2 
3  B 1   6   8  2 
4  B 2   2   3  2 

Więcej przykładów pod numerem http://www.inside-r.org/packages/cran/plyr/docs/ddply.