2015-04-27 12 views
7

Dlaczego funkcja aggregate() tutaj nie działa?Używanie funkcji aggregate() w obiektach data.frame

> aggregate(cbind(var1 = 1:10, var2 = 101:110), 
     by=list(range=cut(1:10, breaks=c(2,4,8,10))), 
     FUN = function(x) 
     { 
     c(obs=length(x[, "var2"]), avg=mean(x[, "var2"]), sd=dev(x[, "var2"])) 
     }) 

Error in x[, "var2"] (from #1) : incorrect number of dimensions 

> cbind(var1 = 1:10, var2 = 101:110)[, "var2"] 
[1] 101 102 103 104 105 106 107 108 109 110 

UPDATE

Zwracany agregat() wartości po uruchomieniu poprawną wersję:

> r = aggregate(data.frame(var1 = 1:10, var2 = 101:110), by=list(range=cut(1:10, breaks=c(2,4,8,10))), FUN = function(x) { c(obs=length(x), avg=mean(x), sd=sd(x)) }) 
> class(r) 
[1] "data.frame" 
> dim(r) 
[1] 3 3 
> r[,1] 
[1] (2,4] (4,8] (8,10] 
Levels: (2,4] (4,8] (8,10] 
> r[,2] 
    obs avg  sd 
[1,] 2 3.5 0.707107 
[2,] 4 6.5 1.290994 
[3,] 2 9.5 0.707107 
> r[,3] 
    obs avg  sd 
[1,] 2 103.5 0.707107 
[2,] 4 106.5 1.290994 
[3,] 2 109.5 0.707107 
> class(r[,2]) 
[1] "matrix" 
> class(r[,3]) 
[1] "matrix" 
+1

'cbind' z numeryczny argumenty zwracają macierz, a nie ramkę danych. I nie spodziewałbyś się podać nazw kolumn wewnątrz anonimowej funkcji dostarczonej FUN. –

Odpowiedz

3

dostarczyć dataframe i zrozumieć, że agregat przechodzi tylko wektory kolumnowe więc korzystanie x[ , "colname"] jest skazany, bo „x” nie jest dataframe:

aggregate(data.frame(var1 = 1:10, var2 = 101:110), 
     by=list(range=cut(1:10, breaks=c(2,4,8,10))), 
     FUN = function(x) 
     { 
     c(obs=length(x), avg=mean(x), sd=sd(x)) 
     }) 
#------------ 
    range var1.obs var1.avg var1.sd var2.obs var2.avg  var2.sd 
1 (2,4] 2.0000000 3.5000000 0.7071068 2.0000000 103.5000000 0.7071068 
2 (4,8] 4.0000000 6.5000000 1.2909944 4.0000000 106.5000000 1.2909944 
3 (8,10] 2.0000000 9.5000000 0.7071068 2.0000000 109.5000000 0.7071068 
+0

Czy "x" jest macierzą? Nie wiedziałbym, jak włamać się do tej części kodu, aby sprawdzić obiekty. –

+0

"x" byłby (liczbami) nazwanymi (atomowymi) wektorami w punkcie, w którym zostały przekazane do "FUN". Nie miałby on wymiaru, więc nie byłby ani macierzą, ani ramką danych. –

+0

Interesujące, więc w jaki sposób otrzymamy długość/średnią/sd dla każdej kolumny w oryginalnym obiekcie data.frame (var1/var2)? Jeśli "x" jest prostym wektorem, czy oznacza to, że FUN jest wywoływana raz dla każdej kolumny data.frame? –

3

To dlatego aggregate nie przechodzi data.frames jego FUN= argument. Przekazuje wektor obserwacji. Indeksowanie nie działa również w przypadku indeksowania [, "name"]. Upewnij się, że przekazałeś dane.frame, a nie macierz, jak w twoim przykładzie. Może chcesz by funkcję zamiast

by(data.frame(var1 = 1:10, var2 = 101:110), 
    list(range=cut(1:10, breaks=c(2,4,8,10))), 
    FUN = function(x) { c(obs=length(x[, "var2"]), avg=mean(x[, "var2"]), sd=sd(x[, "var2"])) }) 
+0

Sprawdziłem kod zbiorczy, przekształca on parametr macierzy na data.frame, jeśli nie jest to obiekt szeregów czasowych. Który "wektor obserwacji" FUN ma dokładnie? –

+0

Przekazuje w kolumnach jako wektory. Działa tylko na jednej kolumnie na raz. – MrFlick