2015-09-01 4 views
7

Supponiamo che io ho i dati in una tabella R che assomiglia a questo:Funzione tabella R: come sommare anziché contare?

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 

Se uso la funzione table su questi dati come:

table(df$Category, df$Mode) 

Mi mostrerà sotto ogni modalità quale categoria ha quante osservazioni. È come contare il numero di elementi in ogni categoria in ciascuna modalità.

Ma cosa succede se voglio la tabella per mostrare sotto ogni Category che Mode guadagnato quanto Profit (somma o media) e non il conteggio totale?

C'è un modo per farlo con la funzione table o un'altra funzione in R?

+0

È possibile riassumere e conta in questo modo: 'tmp = aggregato (df $ Category, per = lista (Category = df $ Mode), FUN = sum) 'o' tmp = aggregate (df $ Category, da = list (Category = df $ Mode), FUN = NROW) '(l'avviso" sum "è in minuscolo e" NROW "è tutto maiuscolo). –

risposta

9

Possiamo usare xtabs da base R. Per impostazione predefinita, il xtabs ottiene l'opzione sum

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

O un altro base R che è più flessibile per applicare diverse FUN è 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 

Oppure possiamo usare dcast convertire da 'lungo' in formato 'wide'. E 'più flessibile, come siamo in grado di specificare la fun.aggregate-sum, mean, median ecc

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 

Se ne avete bisogno nel formato 'lungo', qui è un'opzione con data.table. Convertiamo 'data.frame' in 'data.table' (setDT(df)), raggruppati per 'Categoria' e 'Modalità', otteniamo il valore sum di 'Profitto'.

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

Un'altra possibilità è quella di utilizzare la funzione aggregate():

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