2011-09-16 17 views

Odpowiedz

9

Skocz do połowy sekcji Przykłady help(aggregate) i będzie zobaczyć:

## Formulas, one ~ one, one ~ many, many ~ one, and many ~ many: 
aggregate(weight ~ feed, data = chickwts, mean) 
aggregate(breaks ~ wool + tension, data = warpbreaks, mean) 
aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean) 
aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum) 

Cztery różne połączenia do aggregate(), wszystko za pomocą interfejs formuły. Jak to jest napisane powyżej w co cytujesz ma do czynienia z mechanizmem metoda dyspozytorskiego stosowaną w R.

Rozważmy pierwszy przykład:

R> class(weight ~ feed) 
[1] "formula" 
R> class(chickwts) 
[1] "data.frame" 

więc łączne wywozy na nim pierwszy argument (klasy formula). Sposób, w jaki formuła jest rozwiązywana w R, zwykle obraca się wokół model.matrix, zakładam, że dzieje się tutaj coś podobnego, a równoważne wywołanie jest ostatecznie wykonywane przez aggregate.data.frame, przy użyciu drugiego argumentu chickwts, data.frame.

R> aggregate(weight ~ feed, data = chickwts, mean) 
     feed weight 
1 casein 323.583 
2 horsebean 160.200 
3 linseed 218.750 
4 meatmeal 276.909 
5 soybean 246.429 
6 sunflower 328.917 
R> 

co pytasz nie jest najłatwiejszym Początkujący pytanie, chciałbym polecić dobrą gruntowną spojrzeć na niektóre z dokumentacją i godnej książki R, jeśli masz pod ręką. (I innych SO pytania dać rekomendację, co czytać dalej.)

Edit: musiałem kopać trochę jak aggregate.formula() nie jest wywożona z stats nazw, ale można spojrzeć na to przez wpisanie stats:::aggregate.formula w wierszu - co wtedy wyraźnie pokazuje, że tak jest, w rzeczywistości, wysyłkę do aggregate.data.frame():

[.... some code omitted ...] 
    if (is.matrix(mf[[1L]])) { 
     lhs <- as.data.frame(mf[[1L]]) 
     names(lhs) <- as.character(m[[2L]][[2L]])[-1L] 
     aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...) 
    } 
    else aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...) 
} 
<environment: namespace:stats> 
R> 
+4

Czy istnieje sposób to zrobić bez nazywania wszystkich kolumn w 'cbind()'? Dla wielu kolumn, Chyba nie rozumiem, dlaczego nie można zrobić 'aggregate (. ~ Var, ...)' lub nazwy <- c ("var1", "var2", ...) ', a następnie 'aggregate (df [, names] ~ var, ...)'. Czy to po prostu niemożliwe? – Hendy