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

7

我越来越喜欢使用data.table,它正在取代dplyr成为我的“首选”包,因为它提供的速度是一个很大的优势。

问题

data.table中(dt[i,j]),是否可以直接传递变量给i,而不必创建一个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

我已经阅读了很多关于使用表达式实现此目的的问题

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

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

   val1 val2
1:    3    1

但我想知道是否有一种更加“直接”的方法来完成这个任务,类似于:

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

还是使用表达式的方式来完成这个任务?

1个回答

9

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

如果只有两个元素,我们也可以使用Reducemget(这是@thelatemail答案的一个小变化)

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

eval(as.name(...)) == get() 是正确的吗? - tospig
1
@tospig 这个链接会提供更多的想法。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接