2015-09-01 10 views
7

Załóżmy, że mam dane w tabeli R, który wygląda tak:Funkcja stołu R: jak sumować zamiast liczenia?

Id Name Price sales Profit Month Category Mode 
1 A  2  5  8  1  X  K 
1 A  2  6  9  2  X  K 
1 A  2  5  8  3  X  K 
1 B  2  4  6  1  Y  L 
1 B  2  3  4  2  Y  L 
1 B  2  5  7  3  Y  L 
2 C  2  5 11  1  X  M 
2 C  2  5 11  2  X  L 
2 C  2  5 11  3  X  K 
2 D  2  8 10  1  Y  M 
2 D  2  8 10  2  Y  K 
2 D  2  5 7  3  Y  K 
3 E  2  5 9  1  Y  M 
3 E  2  5 9  2  Y  L 
3 E  2  5 9  3  Y  M 
3 F  2  4 7  1  Z  M 
3 F  2  5 8  2  Z  L 
3 F  2  5 8  3  Z  M 

Gdybym użyć funkcji table o te dane jak:

table(df$Category, df$Mode) 

To pokaże mnie pod każdym trybie jakiej kategorii ma ile obserwacji. To tak, jakby policzyć liczbę przedmiotów w każdej kategorii w każdym trybie.

Ale co jeśli chcę, aby tabela pod każdym Category, która Mode zarobił ile Profit (suma lub średnia), a nie całkowita liczba?

Czy jest jakiś sposób, aby to zrobić z funkcją table lub inną funkcją w R?

+0

można podsumować i policz w ten sposób: 'tmp = aggregate (df $ Category, by = list (Category = df $ Mode), FUN = suma) 'lub' tmp = agregacja (df $ Kategoria, by = lista (kategoria = tryb df $), FUN = NROW) '(zauważ" suma "jest pisana małymi literami, a" NROW "jest literami). –

Odpowiedz

9

Możemy użyć xtabs z base R. Domyślnie xtabs dostaje opcję sum

xtabs(Profit~Category+Mode, df) 
#   Mode 
#Category K L M 
#  X 36 11 11 
#  Y 17 26 28 
#  Z 0 8 15 

Albo inny base R który jest bardziej elastyczny, aby zastosować inny FUN jest tapply.

with(df, tapply(Profit, list(Category, Mode), FUN=sum)) 
# K L M 
#X 36 11 11 
#Y 17 26 28 
#Z NA 8 15 

Albo możemy użyć dcast przekonwertować z 'długi' w formacie szerokim. Jest bardziej elastyczny, jak możemy określić fun.aggregate do sum, mean, median itp

library(reshape2) 
dcast(df, Category~Mode, value.var='Profit', sum) 
# Category K L M 
#1  X 36 11 11 
#2  Y 17 26 28 
#3  Z 0 8 15 

Jeśli jest to potrzebne w formacie „długi”, tu jest jedna opcja z data.table. Konwertujemy dane "data.frame" na "data.table" (setDT(df)), pogrupowane według "kategorii" i "trybu", otrzymujemy sum "zysku".

library(data.table) 
setDT(df)[, list(Profit= sum(Profit)) , by = .(Category, Mode)] 
4

Inna możliwość polega na użyciu aggregate() funkcję:

profit_dat <- aggregate(Profit ~ Category + Mode, data=df, sum) 
#> profit_dat 
# Category Mode Profit 
#1  X K  36 
#2  Y K  17 
#3  X L  11 
#4  Y L  26 
#5  Z L  8 
#6  X M  11 
#7  Y M  28 
#8  Z M  15