2016-08-24 8 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 

質問は、最後の2行をdata.table機能を使用して簡潔に記述することは可能ですか?申し訳ありませんが、これは繰り返しですが、私はまた、Google/stackoverflowにそれを見つけるように正確な目標を説明するのに苦労しています。

+1

'dtの[、.SD [詳細>平均(詳細)]、=グループによる]を' ? (tはRの関数なので、 't'を' dt'に改名しました)。また、 'indx < - dt [、.I [詳細>平均(詳細)]、by = Group] $ V1を実行することもできます。いくつかのパフォーマンスを得るためにdt [indx] 'を使用しています。 –

+0

Davidさん、ありがとう、私はコードを実際には実行しませんでした。私はあなたの答えをチェックした。 –

+0

'data.table' v> = 1.9.7を使うと、' 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] 
関連する問題