2013-04-12 18 views
6

Mam ramki danych tak:Jak agregować niektóre kolumny, zachowując inne kolumny w 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 

i mam nadzieję, że do agregowania datę klatka po id do postaci tak: (tylko zsumować no jeśli mają tę samą id, ale zachować age tam)

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

Jak osiągnąć to za pomocą R?

Odpowiedz

11

Zakładając, że ramka danych ma nazwę df.

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

To działa! Wielkie dzięki! – Nip

+0

To nie działa, gdy dodajesz więcej kolumn, traktuje każdą kolumnę w RHS jako kolumnę czynników do grupowania, więc jeśli na przykład dodasz kolumnę z nie dla każdego wpisu, otrzymasz wiele zduplikowanych wierszy w rezultacie – user5359531

2

Alternatywnie, można użyć ddply z pakietu plyr:

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

W tym konkretnym przykładzie wyniki są identyczne. Jednak nie zawsze tak jest, różnica między obiema funkcjami jest opisana jako here. Obie funkcje mają swoje zastosowania i są warte eksploracji, dlatego czułem, że ta alternatywa powinna być wspomniana.

3

Jeszcze lepiej, 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

A jeśli nie zadeklarowałeś go jako "data.table" (jak można się spodziewać, jeśli właśnie nazywasz 'library (data.table)'), możesz użyć 'setDT (dt) [, lista (suma (nie), unikalna (wiek)), przez = id] '. Lubię "data.table", ale nie wiem, czy powiedziałbym, że to "jeszcze lepiej" niż równie zwięzłe odpowiedzi powyżej :) – Frank

+2

sprawiedliwe, ale mam na myśli jeszcze lepsze w tym sensie, że może to doprowadzić do zacznij używać 'data.table', dywidendy, które są niezmierzone ;-) – MichaelChirico

+0

Dlaczego używasz' unique (age) 'here? Dlaczego nie po prostu 'dt [, sum (no),. (Id, age)]'? Masz zbyt dużo niepotrzebnych naciśnięć klawiszy tutaj –

Powiązane problemy