2013-09-05 14 views
11

私は年に最大回数表示されている被写体のみを保持したいと思うパネルデータ(件名/年)を持っています。データセットが大きいので、私はdata.tableパッケージを使用しています。私が下に試したよりもエレガントなソリューションはありますか?R data.table countパネルデータ

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

本質的に、各ビートルの最もデータが豊富な年のすべてのデータを含む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]が必要ですが、2つではなく1つの一時的な列になります。

スピード上の理由から、.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です。