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)°=="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.
Cancellarlo come se fosse necessario scriverlo per risolvere i problemi. – MichaelChirico