2013-04-12 3 views
6

Ich habe einen Datenrahmen wie folgt aus:Wie aggregiert man einige Spalten, während andere Spalten in R bleiben?

 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 

und ich hoffe, das Datum Rahmen von id zu einer Form wie diese aggregieren: (nur die no summieren, wenn sie die gleiche id, teilen aber age dort halten)

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

Wie erreicht man dies mit R?

Antwort

11

Angenommen, Ihr Datenrahmen heißt df.

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

Es funktioniert! Danke vielmals! – Nip

+0

Dies funktioniert nicht, wenn Sie weitere Spalten hinzufügen. Jede Spalte auf dem RHS wird als eine Spalte von Faktoren behandelt, nach denen gruppiert werden soll. Wenn Sie beispielsweise eine zusätzliche Spalte mit einem Eintrag nicht für jeden Eintrag hinzufügen, werden viele doppelte Zeilen angezeigt als Ergebnis – user5359531

2

Alternativ können Sie ddply aus plyr Paket verwenden:

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

In diesem speziellen Beispiel die Ergebnisse identisch sind. Dies ist jedoch nicht immer der Fall, der Unterschied zwischen den beiden Funktionen ist umrissen here. Beide Funktionen haben ihren Nutzen und sind es wert, erforscht zu werden, weshalb ich diese Alternative als wichtig empfand.

3

Noch besser ist, 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

Und wenn Sie es nicht als 'data.table' deklariert haben (wie es wahrscheinlich ist, wenn Sie gerade' library (data.table) 'aufrufen), können Sie' setDT (dt) [, Liste (Summe (nein), einmalig (Alter)), durch = id] '. Ich mag 'data.table', aber ich weiß nicht, ob ich sagen würde, dass es" noch besser "ist als die ebenso prägnanten Antworten wie oben. – Frank

+2

fair, aber ich meine sogar noch besser in dem Sinne, dass dich das dazu bringen kann fange an, 'data.table' zu ​​verwenden, die Dividenden, wenn sie unermesslich sind ;-) – MichaelChirico

+0

Warum benutzt du' unique (age) 'hier? Warum nicht einfach 'dt [, sum (no),. (Id, age)]'? Sie haben viel zu viele unnötige Tastenanschläge hier –