我是全新的(非常棒)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$id
到set1
,忽略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/