2015-10-08 21 views
7

Je mehr ich es verwende, desto mehr ersetzt data.tabledplyr als mein "Goto" -Paket, da die Geschwindigkeit, die es bietet, ein großes Plus ist.r - Übergabe von Variablen wie data.table Spaltennamen

Frage

Kann passieren Sie Variablen i in data.table (dt[i,j]) withouth eine expression erstellen?

Beispiel

Bei einer data.table:

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

ich evalulate möchte:

dt[(val1 > val2)] 

aber mit einer Variablen die Spaltennamen zu verweisen. Zum Beispiel

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

Ich habe ein lots of questions lesen, die mit Ausdrücken Möglichkeiten, dies zu tun, zeigen:

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

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

    val1 val2 
1: 3 1 

Aber ich frage mich, ob es ein ‚direkter‘ Weg, dies zu tun, dass ich habe verpasst, so etwas wie:

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

Oder ist die expression Weg der Art und Weise dies geschehen soll?

Antwort

6

Wir eval(as.name(..

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

verwenden oder wir können es in der

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

mit get von @thelatemail .SDcols

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

oder eine Option angeben, wenn es nur zwei sind Elemente können wir auch Reduce mitverwenden(eine kleine Variation von @ thelatemail's Antwort)

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

@thelatemail Danke, fügte hinzu. – akrun

+0

Wäre es richtig zu sagen, dass 'eval (as.name (...)) == get()'? – tospig

+1

@tospig Diese [link] (http://adv-r.had.co.nz/Expressions.html) würde mehr Ideen geben. – akrun

Verwandte Themen