2016-08-24 38 views
1

我想根據行子集上的聚合函數在每個子集內的R中對數據表進行子集合。例如,對於每個鍵,返回大於僅爲子集中的行計算的字段平均值的所有值。例如:基於鍵控行的聚合返回行的子集

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 

問題是,是否可以使用data.table功能簡潔地編碼最後兩行代碼?對不起,如果這是一個重複,我也努力解釋確切的目標有谷歌/ stackoverflow找到它。

+1

'DT [,.SD [查看詳細>平均值(詳細信息),通過=集團]'也許? (我已將't'重命名爲'dt',因爲't'是R中的一個函數)。您還可以通過= Group] $ V1;執行indx < - dt [,.I [Detail> mean(Detail)]。 dt [indx]'爲了獲得一些性能 –

+0

謝謝大衛,是的,我沒有真正運行代碼,只是寫了一個例子(t轉置)。我檢查了你的答案,看起來不錯。 –

+0

使用'data.table' v> = 1.9.7,你也可以做一個非equi連接,比如'res < - dt [,mean(Detail),by = Group]; dt [res,。(Group,x.Detail),on =。(Group,Detail> V1)]' –

回答

1

使用.SD函數工作。沒有意識到它,謝謝:

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

同樣適用,具有一定的性能提升:

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