r - 将变量作为data.table列名传递

tos*_*pig 7 r data.table

我使用它越多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应该这样做的路线?

akr*_*run 9

我们可以用 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)

如果只有两个元素,我们还可以使用Reducemget(@ thelatemail的回答略有变化)

dt[Reduce('>', mget(myCol))]
Run Code Online (Sandbox Code Playgroud)