【问题标题】:r - passing variables as data.table column namesr - 将变量作为 data.table 列名传递
【发布时间】:2015-10-08 03:41:38
【问题描述】:

我使用它的次数越多,data.table 就越多地取代 dplyr 作为我的“goto”包,因为它提供的速度是一个很大的优势。

问题

您能否在不创建expression 的情况下将变量传递给data.table (dt[i,j]) 中的i?

示例

给定一个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

但我想知道是否有一种我错过的更“直接”的方法来做到这一点,类似于:

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

或者expression 路由应该这样做吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

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

    【讨论】:

    • 这样说eval(as.name(...)) == get()对吗?
    • @tospig 这个link 会提供更多想法。
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 2021-10-14
    • 2019-07-31
    • 1970-01-01
    • 2021-10-26
    • 2015-11-21
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多