2013-09-05 14 views
11

I dati del pannello (soggetto/anno) per i quali desidero conservare solo i soggetti che compaiono il numero massimo di volte all'anno. Il set di dati è grande, quindi sto usando il pacchetto data.table. C'è una soluzione più elegante di quella che ho provato di seguito?Dati del pannello di conteggio dei dati R dati

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

Quindi, in sostanza, si desidera un data.table con tutti i dati dall'anno più ricco di dati per ogni beatle? –

+0

A pensarci bene, sarebbe bello se 'data.table' avesse alcune delle stesse funzionalità' by' nell'espressione 'i' come nelle espressioni' j'. –

risposta

14

io non sono sicuro che vi vede questo come elegante ma come circa:

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

Questo è in sostanza come applicare by al i espressione come commentato @SenorO. Avrai ancora bisogno di [,COUNT:=NULL] in seguito, ma per una colonna temporanea invece di due.

Scoraggiamo .SD anche se per motivi di velocità, ma speriamo di arrivare presto a questa richiesta di funzionalità in modo che i consigli possano essere eliminati: FR#2330 Optimize .SD[i] query to keep the elegance but make it faster unchanged..

Un approccio diverso è il seguente. È più veloce e idiomatico, ma può essere considerato meno elegante.

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

Qualcosa di simile è here.

Problemi correlati