2013-09-05 3 views
11

1 년 최대 횟수로 나타나는 과목 만 유지하려는 패널 데이터 (주/년)가 있습니다. 데이터 세트가 너무 커서 data.table 패키지를 사용하고 있습니다. 아래에서 시도한 것보다 더 우아한 해결책이 있습니까?R data.table 패널 데이터 수

library(data.table) 

DT <- data.table(SUBJECT=c(rep('John',3), rep('Paul',2), 
          rep('George',3), rep('Ringo',2), 
          rep('John',2), rep('Paul',4), 
          rep('George',2), rep('Ringo',4)), 
       YEAR=c(rep(2011,10), rep(2012,12)), 
       HEIGHT=rnorm(22), 
       WEIGHT=rnorm(22)) 
DT 

DT[, COUNT := .N, by='SUBJECT,YEAR'] 
DT[, MAXCOUNT := max(COUNT), by='YEAR'] 

DT <- DT[COUNT==MAXCOUNT] 
DT <- DT[, c('COUNT','MAXCOUNT') := NULL] 
DT 
+0

본질적으로 각 beatle에 대해 가장 데이터가 풍부한 해의 모든 데이터가 포함 된 data.table을 원하십니까? –

+0

'j' 표현식에서와 마찬가지로'data.table'에'i' 표현식과 동일한'by' 기능이 있으면 좋을 것 같습니다. –

답변

14

난 당신이 우아한으로 이것을 볼 수 있습니다 모르겠지만 방법 :

@SenorO은 주석으로 i 표현 by을 적용하는 방법을 근본적으로의
DT[, COUNT := .N, by='SUBJECT,YEAR'] 
DT[, .SD[COUNT == max(COUNT)], by='YEAR'] 

. 나중에 [,COUNT:=NULL]이 필요하지만 두 개가 아닌 하나의 임시 열에 대해 필요합니다.

속도가 느려지므로 .SD을 권장하지만 조만간이 기능 요청을 받아서 조언을 누락시킬 수 있습니다 : FR#2330 Optimize .SD[i] query to keep the elegance but make it faster unchanged..

다른 접근 방법은 다음과 같습니다. 더 빠르고 관용적이지만 덜 우아하다고 여겨 질 수 있습니다.

# Create a small aggregate table first. No need to use := on the big table. 
i = DT[, .N, by='SUBJECT,YEAR'] 

# Find the even smaller subset. (Do as much as we can on the small aggregate.) 
i = i[, .SD[N==max(N)], by=YEAR] 

# Finally join the small subset of key values to the big table 
setkey(DT, YEAR, SUBJECT) 
DT[i] 

비슷한 것은 here입니다.