2015-04-01 20 views
5

Questa sembra una domanda davvero semplice ma la sua soluzione mi ha eluso per circa 90 minuti di provare, cercare e leggere manuali e online.Sottoinsieme programmatico di un data.table in R

Di 'Ho un data.table:

DT<-data.table(a=runif(n = 10),b=runif(n = 10),c=runif(n = 10)) 

Chiaramente qualcosa come questo funziona:

DT[a > 0.5] 

e mi dà il sottoinsieme dei DT, dove i valori nella colonna "a" sono maggiore di 0,5. Ma cosa succede se voglio essere un po 'più flessibile (perché il sottoinsieme è incorporato in una routine più grande).

Quello che mi piacerebbe fare è di rendere questo proto-funzione di lavoro:

flexSubset<-function(sColumnToSubset,dMin){ 
subs<-DT[sColumnToSubset>dMin] 
return(subs) 
} 

Ho provato senza successo, tra molti altri ...

with=FALSE 

Qualche suggerimento? Molte grazie per il vostro tempo in anticipo!

+1

Immagino che 'DT [eval (parse (text = sColumnToSubset)) nicola

risposta

8

Se si vuole passare una stringa, quindi fare questo:

flexSubset = function(sColumnToSubset, dMin) 
       DT[get(sColumnToSubset) > dMin] 

flexSubset("a", 0.5) 

Se si desidera passare un'espressione non valutata, quindi:

flexSubset = function(sColumnToSubset, dMin) { 
       lhs = substitute(sColumnToSubset) 
       DT[eval(lhs) > dMin] 
      } 

flexSubset(a, 0.5) 
flexSubset(a/b, 0.5) 
+0

Fantastico! Grazie!!! – russfx