2016-08-24 3 views
1

Ich möchte eine Datentabelle in R innerhalb jeder Teilmenge basierend auf einer Aggregatfunktion über die Teilmenge von Zeilen unterteilen. Geben Sie beispielsweise für jeden Schlüssel alle Werte zurück, die größer als der Mittelwert eines Feldes sind, das nur für Zeilen in der Teilmenge berechnet wird. Beispiel:Zurückgeben einer Teilmenge von Zeilen basierend auf einem Aggregat von codierten Zeilen

library(data.table) 
t=data.table(Group=rep(c(1:5),each=5),Detail=c(1:25)) 
setkey(t,'Group') 
library(foreach) 
library(dplyr) 

ret=foreach(grp=t[,unique(Group)],.combine=bind_rows,.multicombine=T) %do% 
    t[Group==grp&Detail>t[Group==grp,mean(Detail)],] 
#  Group Detail 
# 1:  1  4 
# 2:  1  5 
# 3:  2  9 
# 4:  2  10 
# 5:  3  14 
# 6:  3  15 
# 7:  4  19 
# 8:  4  20 
# 9:  5  24 
#10:  5  25 

Die Frage ist, ist es möglich, die letzten beiden Zeilen mit data.table Funktionen kurz und bündig zu codieren? Sorry, wenn dies eine Wiederholung ist, habe ich auch Schwierigkeiten, das genaue Ziel zu erklären, damit Google/stackoverflow es findet.

+1

'dt [, .SD [Detail> Mittelwert (Detail)], durch = Gruppe]' vielleicht ? (Ich habe "t" in "dt" umbenannt, weil "t" eine Funktion in R ist). Sie könnten auch 'indx <- dt [, .I [Detail> Mittelwert (Detail)], nach = Gruppe] $ V1; dt [indx] 'um etwas Leistung zu bekommen –

+0

Danke David, yeah, ich habe den Code nicht wirklich ausgeführt, ich habe ihn nur für ein Beispiel geschrieben (t transponieren). Ich habe deine Antworten überprüft, sieh toll aus. –

+0

Mit 'data.table' v> = 1.9.7 können Sie auch einen nicht-equi-Join wie' res <- dt [, Mittelwert (Detail), von = Gruppe]; dt [res,. (Gruppe, x.Detail), on =. (Gruppe, Detail> V1)] ' –

Antwort

1

Die Verwendung der .SD-Funktion funktioniert. War nicht bewusst zu sein, dank:

dt[, .SD[Detail > mean(Detail)], by = Group] 

arbeitet auch mit einigen Performance-Gewinne:

indx <- dt[, .I[Detail > mean(Detail)], by = Group]$V1 ; dt[indx] 
Verwandte Themen