2013-09-05 39 views
11

Yalnızca yılda en çok kez görünen konuları tutmak istediğim panel verilerini (konu/yıl) kullanıyorum. Veri kümesi büyük olduğundan data.table paketini kullanıyorum. Aşağıda denediğimden daha zarif bir çözüm var mı?R data.table sayım paneli verileri

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

Öyleyse, temel olarak, her bir veri için en çok veri açısından zengin olan tüm verilerden bir data.table ister misiniz? –

+0

Bunu düşünmeye gelince, 'data.table'' j' ifadelerinde olduğu gibi ''' ifadesinde aynı' '' yeteneklerin bazılarına sahip olsaydı iyi olurdu. –

cevap

14

Sana zarif olarak bu Görüntüleyeceğiniz emin değilim ama nasıl:

@SenorO yorumladı olarak i ifadeye by nasıl uygulanacağını esasen var
DT[, COUNT := .N, by='SUBJECT,YEAR'] 
DT[, .SD[COUNT == max(COUNT)], by='YEAR'] 

. Daha sonra [,COUNT:=NULL]'a ihtiyacınız var, ancak iki yerine bir geçici sütun için.

Hız nedenleriyle olsa da .SD disosurage yapıyoruz, ancak umarım bu tavsiyeye kısa sürede ulaşırız, böylece tavsiye düşebilir: FR#2330 Optimize .SD[i] query to keep the elegance but make it faster unchanged..

Farklı bir yaklaşım aşağıdaki gibidir. Daha hızlı ve deyimseldir, ancak daha az zarif olarak kabul edilebilir.

# 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] 

Benzer bir şey here.

İlgili konular