2015-10-08 20 views
7

Tôi càng sử dụng nó, càng có nhiều data.table thay thế dplyr làm gói 'goto' của tôi với tốc độ lớn hơn.r - biến biến là tên cột data.table

Câu hỏi

Bạn có thể vượt qua các biến để i trong data.table (dt[i,j]) withouth tạo ra một expression?

Ví dụ

Cho một data.table:

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

Tôi muốn evalulate:

dt[(val1 > val2)] 

nhưng sử dụng một biến để tham khảo các tên cột. Ví dụ,

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

Tôi đã đọc một lots of questions cho thấy cách để làm điều này với các biểu thức:

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

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

    val1 val2 
1: 3 1 

Nhưng tôi đã tự hỏi nếu có một cách hơn 'trực tiếp' để làm điều này mà tôi đã bị mất, một điều gì đó giống như:

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

Hoặc là cách thực hiện điều này?

Trả lời

6

Chúng ta có thể sử dụng eval(as.name(..

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

Hoặc chúng ta có thể xác định nó trong .SDcols

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

Hoặc một tùy chọn sử dụng get bởi @thelatemail

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

Nếu chỉ có hai các yếu tố, chúng tôi cũng có thể sử dụng Reduce với mget (một biến thể nhỏ của câu trả lời của @ thelatemail)

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

@thelatemail Xin cảm ơn, đã thêm nó. – akrun

+0

Sẽ đúng khi nói rằng 'eval (as.name (...)) == get()'? – tospig

+1

@tospig [link] này (http://adv-r.had.co.nz/Expressions.html) sẽ cung cấp thêm ý tưởng. – akrun

Các vấn đề liên quan