我使用的越多,data.table
替换dplyr
的次数就越多,因为我的“转到”#39;包装作为它提供的速度是一个很大的优点。
问题
您可以在data.table(i
)中将变量传递给dt[i,j]
而不创建expression
吗?
示例
给出data.table:
library(data.table)
dt <- data.table(val1 = c(1,2,3),
val2 = c(3,2,1))
我想评估一下:
dt[(val1 > val2)]
但使用变量来引用列名。例如,
myCol <- c("val1", "val2") ## vector of column names
我已经阅读了lots of questions,其中显示了使用表达式执行此操作的方法:
## create an expression to evaluate
expr <- parse(text = paste0(myCol[1], " > ", myCol[2]))
## evaluate expression
dt[(eval(expr))]
val1 val2
1: 3 1
但我想知道是否还有更多&#39;直接&#39;这样做的方式我错过了,类似于:
dt[(myCol[1] > myCol[2])]
或expression
路线是应该这样做的方式吗?
答案 0 :(得分:8)
我们可以使用eval(as.name(..
dt[eval(as.name(myCol[1]))> eval(as.name(myCol[2]))]
或者我们可以在.SDcols
dt[dt[, .I[.SD[[1]]> .SD[[2]]], .SDcols= myCol]]
或@thelatemail
使用get
的选项
dt[get(myCol[1]) > get(myCol[2])]
如果只有两个元素,我们也可以将Reduce
与mget
一起使用(@ thelatemail答案的略微变化)
dt[Reduce('>', mget(myCol))]