2015-10-08 6 views
7

Più lo uso, più data.table sostituisce dplyr come pacchetto "goto" in quanto la velocità che offre è un grande vantaggio.r - passare le variabili come nomi di colonne data.table

Domanda

Puoi passare variabili a i a data.table (dt[i,j]) tecnico senza la creazione di un expression?

Esempio

Dato un data.table:

library(data.table) 
dt <- data.table(val1 = c(1,2,3), 
       val2 = c(3,2,1)) 

desidero evalulate:

dt[(val1 > val2)] 

ma utilizzando una variabile per riferimento ai nomi di colonna. Ad esempio,

myCol <- c("val1", "val2") ## vector of column names 

Ho letto un lots of questions che mostrano modi di fare questo con le espressioni:

## create an expression to evaluate 
expr <- parse(text = paste0(myCol[1], " > ", myCol[2])) 

## evaluate expression 
dt[(eval(expr))] 

    val1 val2 
1: 3 1 

ma mi chiedevo se esiste un modo più 'diretto' per fare questo che ho 'Ho perso, qualcosa di simile a:

dt[(myCol[1] > myCol[2])] 

O è il percorso expression il modo in cui questo dovrebbe essere fatto?

risposta

6

Possiamo usare eval(as.name(..

dt[eval(as.name(myCol[1]))> eval(as.name(myCol[2]))] 

Oppure possiamo specificarlo nel .SDcols

dt[dt[, .I[.SD[[1]]> .SD[[2]]], .SDcols= myCol]] 

O un'opzione usando get da @thelatemail

dt[get(myCol[1]) > get(myCol[2])] 

Se ci sono solo due elementi, possiamo anche usare Reduce con mget (una leggera variazione di risposta di @ thelatemail)

dt[Reduce('>', mget(myCol))] 
+0

@thelatemail Grazie, aggiunse. – akrun

+0

Sarebbe corretto dire che 'eval (as.name (...)) == get()'? – tospig

+1

@tospig Questo [collegamento] (http://adv-r.had.co.nz/Expressions.html) darebbe più idee. – akrun