2015-10-08 14 views
7

Im częściej go używam, tym bardziej data.table zastępuje dplyr jako mój pakiet "goto", ponieważ prędkość, którą oferuje, to duży plus.r - przekazywanie zmiennych jako data.table nazw kolumn

Pytanie

można przekazać zmienne do i w data.table (dt[i,j]) withouth tworzenia expression?

Przykład

Biorąc pod uwagę data.table:

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

Chciałbym evalulate:

dt[(val1 > val2)] 

ale stosując zmienną odwoływać się do nazw kolumn. Na przykład,

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

Czytałem lots of questions które pokazują sposoby robienia tego z wyrażeń:

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

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

    val1 val2 
1: 3 1 

ale zastanawiałem się, czy istnieje bardziej „bezpośredni” sposobem na to, że Wcześniej brakowało, coś w rodzaju:

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

Albo jest droga expression sposób należy to zrobić?

Odpowiedz

6

Możemy użyć eval(as.name(..

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

Albo możemy określić go w .SDcols

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

lub opcji używając get przez @thelatemail

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

Jeśli istnieją tylko dwa elementy, możemy również użyć Reduce z mget (niewielka odmiana odpowiedzi @ thelatemail)

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

@mailmail Dzięki, dodał. – akrun

+0

Czy słusznie byłoby powiedzieć, że 'eval (as.name (...)) == get()'? – tospig

+1

@tospig Ten [link] (http://adv-r.had.co.nz/Expressions.html) dałby więcej pomysłów. – akrun