2016-04-25 50 views
0

ich eine data.table in R haben, die wie dieses aussieht:R data.table: zusammenfassen Werte von mehreren Reihen

code gruppe proz_grouped 
1: 1  2 14.751689 
2: 2  2 22.063523 
3: 3  2 35.441111 
4: 4  2 27.743676 
5: 1  3  7.575869 
6: 2  3 23.420090 
7: 3  3 38.513576 
8: 4  3 30.490465 

Gibt es eine einfache, elegante Weise die Summe von zu bekommen proz_grouped für die Codes (code) 3 und 4 nach Gruppe gruppe? Das Ergebnis sollte etw. wie folgt:

code gruppe proz_grouped 
1: 1  2 14.751689 
2: 2  2 22.063523 
3: NA  2 63.18471 
5: 1  3  7.575869 
6: 2  3 23.420090 
7: NA  3 69.0035 

Da Code nicht zusammengefasst werden kann, würde ich eine NA für die Code-Spalte erwarten.

Dank

+0

Verwendung 'dput' um Code für ein reproduzierbares Beispiel zu erstellen, mehr Punkte auf deine Frage zu bekommen, mehr Leute in die Beantwortung miteinbeziehen, mehr Antworten erhalten – jangorecki

Antwort

2

Wir recode verwenden können, um die Werte zu ändern und dann durch sum

library(data.table) 
library(car) 
df1[, code := recode(code, "c(3,4)=NA") 
     ][, list(proz_grouped = sum(proz_grouped)), .(code, gruppe)] 
# code gruppe proz_grouped 
#1: 1  2 14.751689 
#2: 2  2 22.063523 
#3: NA  2 63.184787 
#4: 1  3  7.575869 
#5: 2  3 23.420090 
#6: NA  3 69.004041 

die Gruppe tun Oder %in% 3 zu ändern 4 in NA, Gruppe verwenden, die von 'Code', ‚gruppe 'und die sum von get 'proz_grouped'

df1[code %in% 3:4, code := NA][, 
     .(proz_grouped = sum(proz_grouped)) ,.(code, gruppe)] 
+2

oder ein kleiner Hack mit ifelse vorausgesetzt, der Wert OP will aggregieren sind über '2':' setDT (y) , code: = ifelse (code> 2, NA, code)] [,. (res = sum (proz_grouped)),. (gruppe, code)] ' –

+2

Die zu ändernde data.table wäre' DT [code] 2, Code: = NA] '. Es ist nicht klar, dass das OP tatsächlich die Code-Variable bearbeiten möchte, obwohl; für mich sieht es so aus, als ob sie es nur vorübergehend für diese Zusammenfassung wollen. – Frank

+1

@eddi Sie haben Recht, aber ich habe es als data.frame kopiert und in 'data.table' konvertiert. Habe vergessen, den 'setDT'-Teil zu nehmen – akrun

2
dt[, .(proz_grouped = sum(proz_grouped)) 
    , by = .(code = replace(code, code > 2, NA), gruppe)] 
# code gruppe proz_grouped 
#1: 1  2 14.751689 
#2: 2  2 22.063523 
#3: NA  2 63.184787 
#4: 1  3  7.575869 
#5: 2  3 23.420090 
#6: NA  3 69.004041 
Verwandte Themen