r - 如何通过变量将参数传递到 data.table[J()]

标签 r optimization data.table

我是全新的(非常棒)data.table包,似乎陷入了一个非常基本、有点奇怪的问题。我无法发布我正在使用的确切数据集,对此我深表歉意 - 但我认为问题很简单,足以阐明,希望这仍然非常清楚。

假设我有一个像这样的 data.table,键为 x:

set1
   x y
1: 1 a
2: 1 b
3: 1 c
4: 2 a

我想返回 set1 的子集包含 x == 1 的所有行。这在 data.table 中非常简单: set1[J(1)] 。嘭。完毕。我还可以分配 z <- 1 ,并调用set1[J(z)] 。再说一遍:效果很好。

...除非我尝试将其扩展到我的实际数据集(其中包含约 6M 行)。当我调用set1[J(1674)]时,我得到了 78 行的返回值,这正是我正在寻找的。但我需要能够查找(字面上的)4M 个这些子集。当我将要搜索的值分配给变量时,id <- 1674 ,并调用set1[J(id)] ... R 几乎毁掉了我的桌面。

显然有些事情我不明白在 data.table 引擎盖下发生了什么,但我一直无法弄清楚是什么。通过 Google 搜索和 Stack Overflow 的搜索表明这应该可行。出于纯粹的奇思妙想,我尝试过:

id <- quote(1674)
set1[J(eval(id))]

...但这更糟糕。什么……这是怎么回事?

最佳答案

[@mnel 在我写作时抢先一步...]

几乎可以肯定,set1 的一列恰好被称为“id”;即,

isTRUE("id" %in% names(set1))

导致set1[J(id)]自连接set1$idset1,忽略id 在调用范围内。

如果是这样,有几种方法可以避免诸如此类的范围问题:

.id = <your 4M ids>
set1[J(.id)]

或者使用在调用范围内评估单个名称i的事实:

JDT=J(id); set1[JDT]

或者 eval 在调用范围内也是 eval :

set1[eval(J(id))]

或者,我们确实想让它更清晰、更强大、更容易,所以一个想法是添加 .. :

set1[..(J(id))]     # .. alias for eval

或者也许:

set1[J(..id)]

其中..借用了文件系统的..的含义,意思是上一级。如果 .. 是符号的前缀,那么您可以执行以下操作:

DT[colB==..id]

其中使用 == 进行说明。在该示例中,colB 预计为列名称,而 ..id 将在调用范围(上一级)中找到 id。我们的想法是,代码的读者会非常清楚程序员的意图。

关于r - 如何通过变量将参数传递到 data.table[J()],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13921670/

相关文章:

python - 正则表达式忽略引号中的模式(Python 或 R)

c++ - 为什么使用三元运算符返回字符串会生成与在等效的 if/else block 中返回的代码截然不同的代码?

c# - 返回新结构时如何防止复制?

r - 按任意时间段聚合时间序列数据

r - 在 unnest_wider 之后命名提升向量中的列

r - tidyr::spread 和 dplyr::summarise 中的隐式排序

r - 将额外的图插入多面网格,ggplot2

javascript - 当函数绑定(bind)到许多链接时,JavaScript/Jquery 的解释性质是否会增加代码大小?

r - order data.table along numeric column puttint special Value (residual category) of other column 最后

r//如果一个data.table的其他列中的多个条件满足,则统计行数并求和列值//高效快速的data.table解决方案