我使用它越多data.table,替换dplyr为我的'goto'包就越多,因为它提供的速度是一大优点.
题
你可以i在data.table(dt[i,j])中传递变量而不创建一个expression?
例
给出data.table:
library(data.table)
dt <- data.table(val1 = c(1,2,3),
val2 = c(3,2,1))
Run Code Online (Sandbox Code Playgroud)
我想评估一下:
dt[(val1 > val2)]
Run Code Online (Sandbox Code Playgroud)
但使用变量来引用列名.例如,
myCol <- c("val1", "val2") ## vector of column names
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多问题,通过表达式显示了这样做的方法:
## create an expression to evaluate
expr <- parse(text = paste0(myCol[1], " > ", myCol[2]))
## evaluate expression
dt[(eval(expr))]
val1 val2
1: 3 1
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有一种更"直接"的方法可以做到这一点,我错过了,类似于:
dt[(myCol[1] > myCol[2])]
Run Code Online (Sandbox Code Playgroud)
或者是expression应该这样做的路线?
我们可以用 eval(as.name(..
dt[eval(as.name(myCol[1]))> eval(as.name(myCol[2]))]
Run Code Online (Sandbox Code Playgroud)
或者我们可以在中指定它 .SDcols
dt[dt[, .I[.SD[[1]]> .SD[[2]]], .SDcols= myCol]]
Run Code Online (Sandbox Code Playgroud)
或get@thelatemail 使用的选项
dt[get(myCol[1]) > get(myCol[2])]
Run Code Online (Sandbox Code Playgroud)
如果只有两个元素,我们还可以使用Reduce与mget(@ thelatemail的回答略有变化)
dt[Reduce('>', mget(myCol))]
Run Code Online (Sandbox Code Playgroud)