2016-08-24 2 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 기능을 사용하여 마지막 두 줄을 코딩 할 수 있습니까? 죄송합니다 이것이 반복 있다면, 나는 또한 정확한 목표를 설명하는 데 어려움을 겪고 있습니다. google/stackoverflow 찾을 수 있습니다.

+1

'의 DT [.SD [상세보기> 평균 (세부 사항)] = 그룹에 의해]'어쩌면 ? ('t'는'R'에있는 함수이기 때문에't''를'dt'로 이름을 바꾸 었습니다. 'indx <- dt [, .I [Detail> mean (Detail)], 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] 
관련 문제