2015-04-28 9 views
6

Sto provando a utilizzare gli argomenti a data.table sottoinsieme (e applicare una media a tale sottoinsieme). Fondamentalmente passerò alla funzione due chiavi e diversi elementi della terza chiave; ciò sembra confondere R, ma l'operazione funziona esattamente come previsto quando viene eseguita al di fuori di un ambiente di funzione.Problema di confusione sul sottoinsieme di chiavi multiple data.table all'interno della funzione

Ecco un esempio che fondamentalmente ottiene ciò che sto cercando di fare; restituisce una soluzione che non è corretto, mentre il mio proprio codice genera un errore (testo incollato sotto):

set.seed(12345) 
dt<-data.table(yr=rep(2000:2005,each=20), 
       id=paste0(rep(rep(1:10,each=2),6)), 
       deg=paste0(rep(1:2,60)), 
       var=rnorm(120), 
       key=c("yr","id","deg")) 

fcn <- function(yr,ids,deg){ 
    dt[.(yr,ids,deg),mean(var)] 
} 

fcn(2004,paste0(1:3),"1") 

Si tratta di dare una risposta, ma è del tutto sbagliato (più su che in un secondo). Se faccio questo a mano, non c'è problema:

> fcn(2004,paste0(1:3),"1") 
[1] 0.1262586 
> dt[yr==2004&id %in% paste0(1:3)&deg=="1",mean(var)] 
[1] 0.4374115 
> dt[.(2004,paste0(1:3),"1"),mean(var)] 
[1] 0.4374115 

Per rompere quello che sta succedendo, ho cambiato il codice fcn a:

fcn <- function(yr,ids,deg){ 
    dt[.(yr,ids,deg),] 
} 

che produce:

> fcn(2004,paste0(1:3),"1") 
     yr id deg  var 
    1: 2000 1 1 0.5855288 
    2: 2000 2 2 -0.4534972 
    3: 2000 3 1 0.6058875 
    4: 2000 1 2 0.7094660 
    5: 2000 2 1 -0.1093033 
---      
116: 2005 2 2 -1.3247553 
117: 2005 3 1 0.1410843 
118: 2005 1 2 -1.1562233 
119: 2005 2 1 0.4224185 
120: 2005 3 2 -0.5360480 

In sostanza, fcn ha effettuato senza subset! Perché sta succedendo? Davvero frustrato.

Se si passa solo una chiave anziché tre, dt sottoinsiemi sulla chiave centrale solo. Strano:

> fcn(2004,"1","1") 
     yr id deg  var 
    1: 2000 1 1 0.5855288 
    2: 2000 1 2 0.7094660 
    3: 2000 1 1 0.5855288 
    4: 2000 1 2 0.7094660 
    5: 2000 1 1 0.5855288 
---      
116: 2005 1 2 -1.1562233 
117: 2005 1 1 0.2239254 
118: 2005 1 2 -1.1562233 
119: 2005 1 1 0.2239254 
120: 2005 1 2 -1.1562233 

Ma se mi passa solo i tasti centrali alla funzione, funziona benissimo:

fcn <- function(ids){ 
    dt[.(2004,ids,"1")] 
} 
> fcn(paste0(1:3)) 
    yr id deg  var 
1: 2004 1 1 0.6453831 
2: 2004 2 1 -0.3043691 
3: 2004 3 1 0.9712207 

montaggio finale: problema risolto, ma sarebbe comunque bello sapere che cosa esattamente non andava:

Rinominare gli argomenti:

fcn <- function(yyr,ids,ddeg){ 
    dt[.(yyr,ids,ddeg),mean(var)] 
} 

Qualcosa sul riutilizzo dei nomi delle colonne come nomi di variabili ha causato un problema, a quanto pare - ma non capisco ancora completamente cosa è andato storto.

+0

Cancellarlo come se fosse necessario scriverlo per risolvere i problemi. – MichaelChirico

risposta

7

Il problema è che si sta utilizzando nomi delle colonne all'interno del vostro i-expression, ma li aspettavo di essere nomi fuori del data.table. È possibile rinominare i nomi delle variabili nella funzione, o costruire il join data.table esterno e quindi utilizzare il fatto che per i nomi di singoli data.table sarà sempre utilizzare l'ambiente esterno:

fcn <- function(yr,ids,deg){ 
    tmp = data.table(yr, ids, deg) 
    dt[tmp, mean(var)] 
} 

fcn(2004, paste0(1:3), "1") 
#[1] 0.4374115 

Vedi FAQ 2,12-2,13.

+0

Quindi questo è fondamentalmente un problema di ambiente - Ho bisogno di accedere alle variabili 'yr' e' deg', ma '[.data.table' prima guarda nell'ambito di' dt' e si ferma lì quando trova quelle colonne (mai spostarsi nell'ambiente di funzione in cui sono memorizzati i valori che ho passato a 'yr' e' deg'. Manca qualcosa? – MichaelChirico

+0

@MichaelChirico sì, è corretto – eddi

+0

Ahhh, quindi perché 'fcn (2004," 1 "," 1 ")' funzionava perché solo l'argomento medio era denominato in modo univoco ('ids' contro' id'). Subdolo. – MichaelChirico

Problemi correlati