2011-07-23 12 views
6

znam polecenia jak xtabs i stołem umożliwić użytkownikowi przecinają-tabelaryczneobliczenie średniej wartości w tabelach za pomocą wzoru [R]

przykładowo następujące komenda stół obrotowy, który przedstawia liczbę samochodów, które mają tę samą liczbę kół zębatych i cylindrów.

> xtabs(~cyl+gear, data = mtcars) 
    gear 
cyl 3 4 5 
    4 1 8 2 
    6 2 4 1 
    8 12 0 2 
> 

Możemy rozszerzyć formułę więc może wykazać sumę koni mocy dla samochodów w każdym pojemniku

> xtabs(hp~cyl+gear, data = mtcars) 
    gear 
cyl 3 4 5 
    4 97 608 204 
    6 215 466 175 
    8 2330 0 599 
> 

jestem teraz zastanawiasz się, czy to możliwe, aby obliczyć średnią z uprawnień konnych dla samochodów w każdym koszu? na przykład coś takiego xtabs(mean(hp)~cyl+gear, data = mtcars)

+2

nie jestem pewien jak to zrobić za pomocą 'xtabs' (który nigdy nie używałem wcześniej), ale aby to zrobić z pakietem' reshape', jednym ze sposobów jest 'obsada (topnienie (mtcars, id = c ("cyl", "gear")), cyl ~ gear, podzbiór = zmienna == "hp", średnia) '. – grautur

+1

xtabs (hp ~ cyl + gear, data = mtcars)/xtabs (~ cyl + gear, data = mtcars) – jverzani

Odpowiedz

10

Można to zrobić w jednej linii przy użyciu cast z reshape biblioteki

cast(mtcars, cyl ~ gear, value = 'hp', fun = mean) 
+0

+1 proste, jasne, bezpośrednie. Dobra odpowiedź jak zawsze Ramnath! –

7

Jednym z interesujących odpowiedzi, które otrzymałem z R-pomoc jest następująca:

> attach(mtcars) 
> tapply(hp,list(cyl,gear),mean) 
     3  4  5 
4 97.0000 76.0 102.0 
6 107.5000 116.5 175.0 
8 194.1667 NA 299.5 
> 
+1

Tak, to jest właściwe! Nie używam xtabs, po prostu używam standardowego tapply, apply, lapply function, ponieważ oni wykonują wszystko. Po raz pierwszy muszę go rozwiązać za pomocą standardowego tapply, i to jest! Dzięki. – TMS

+1

+1 dla bazy, ale bez potrzeby dołączania, wystarczy użyć listy funkcji (x) (x $ cyl, x $ gear), średnia) w oświadczeniu o stosowaniu. Dołączanie jest złą praktyką programowania i może prowadzić do dużych problemów w późniejszym czasie. –

+3

Lub 'with (mtcars, tapply (hp, list (cyl, gear), mean))' –

3

(Moving mój komentarz z odpowiedzią, więc mogę lepiej go edytować.)

Nie jestem pewien, jak to zrobić z xtabs (którego nigdy wcześniej nie używałem), ale oto kilka sposobów zrobienia tego przy użyciu pakietów reshape i plyr.

> x = melt(mtcars, id = c("cyl", "gear"), measure = c("hp")) 
> cast(x, cyl ~ gear, mean) 

> x = ddply(mtcars, .(cyl, gear), summarise, hp = mean(hp)) 
> cast(x, cyl ~ gear) 
+0

+1 dla obsady, nie trzeba się jednak topić! –

0

Inny sposób obliczania jest za pomocą funkcji zagregowanego(). Chociaż dane wyjściowe nie mają postaci tabeli. (Przez twitter)

> aggregate(hp~cyl+gear,data=mtcars,mean) 
    cyl gear  hp 
1 4 3 97.0000 
2 6 3 107.5000 
3 8 3 194.1667 
4 4 4 76.0000 
5 6 4 116.5000 
6 4 5 102.0000 
7 6 5 175.0000 
8 8 5 299.5000 
> 
Powiązane problemy