2013-04-12 21 views
6

Ho un frame di dati come questo:Come aggregare alcune colonne mantenendo le altre colonne in R?

 id no age 
1 1 7 23 
2 1 2 23 
3 2 1 25 
4 2 4 25 
5 3 6 23 
6 3 1 23 

e spero di aggregare la cornice data entro id ad una forma simile a questo: (basta sommare il no se condividono la stessa id, ma mantenere age lì)

id no age 
1 1 9 23 
2 2 5 25 
3 3 7 23 

Come ottenere ciò utilizzando R?

risposta

11

Supponendo che il frame di dati sia denominato df.

aggregate(no~id+age, df, sum) 
# id age no 
# 1 1 23 9 
# 2 3 23 7 
# 3 2 25 5 
+1

Funziona! Molte grazie! – Nip

+0

Questo non funziona quando aggiungi più colonne, tratta ogni colonna sul RHS come una colonna di fattori da raggruppare, quindi ad esempio se includi una colonna in più con una non per ogni voce, ti ritroverai con molte righe duplicate come risultato – user5359531

2

In alternativa, è possibile utilizzare ddply dal pacchetto plyr:

require(plyr) 
ddply(df,.(id,age),summarise,no = sum(no)) 

In questo particolare esempio i risultati sono identici. Tuttavia, questo non è sempre il caso, la differenza tra le due funzioni è delineata here. Entrambe le funzioni hanno i loro usi e valgono la pena di essere esplorate, motivo per cui ho sentito che questa alternativa dovrebbe essere menzionata.

3

Ancora meglio, data.table:

library(data.table) 
# convert your data.frame/object to a data.table (by reference) to unlock data.table syntax 
setDT(DF) 
DF[ , .(sum_no = sum(no), unq_age = unique(age)), by = id] 
+0

E se non lo hai dichiarato come 'data.table' (come è probabile che tu stia chiamando ora' library (data.table) '), puoi usare' setDT (dt) [, lista (somma (no), unico nel suo genere (età) di), = id] '. Mi piace 'data.table', ma non so se direi che è" Ancora migliore "rispetto alle risposte ugualmente concise sopra :) – Frank

+2

fiera, ma intendo ancora meglio, nel senso che questo potrebbe farti arrivare inizia a usare 'data.table', i dividendi se sono incommensurabili ;-) – MichaelChirico

+0

Perché usi' unique (age) 'qui? Perché non solo 'dt [, sum (no),. (Id, age)]'? Avete troppe sequenze di tasti inutili qui –

Problemi correlati