【发布时间】:2013-10-03 21:26:51
【问题描述】:
我想使用 data.table 包根据多个不等式条件对我的数据进行子集化。 data.table 手册中的示例显示了如何使用字符变量而不是数值不等式来执行此操作。我还看到了如何使用子集函数来做到这一点。但我真的很想利用 data.table 的二进制搜索速度。下面是我正在尝试做的一个示例。
library(data.table)
data <- data.table(X=seq(-5,5,1), Y=seq(-5,5,1), Z=seq(-5,5,1))
data
setkey(data, X, Y, Z)
#the data.frame way
data[X > 0 & Y > 0 & Z > 0]
#the data.table way (does not work as I expected)
data[J(>0, >0, >0)]
【问题讨论】:
-
等等,但是......“data.frame 方式”在这里有效,对吧?事实上,它会因为 data.frame 而失败。
J用于“加入”,将对象子集作为第一步;但“data.frame 方式”是不等式子集的正常方式。 -
另外,澄清一下,
J将采用 X、Y 和 Z 的值,而不是它们的条件;然后合并/加入这些值。并且需要键入“数据”才能使其正常工作。 -
@Frank +1 我们可能应该对
i进行一些优化,以便不等式使用引擎盖下的关键。我想人们在介绍小插曲中明白不要使用==,然后期望类似的概念适用于矢量扫描>。也许甚至==应该使用引擎盖下的钥匙,因为它更自然。 -
@Frank 更简单:
DT[X > 0 & Y > 0 & Z > 0]只会自动使用密钥。由于这是 R,我们可以采用i表达式并在评估之前对其进行优化。 -
@Frank 没错。如果我们可以将
==、>和<与|或&的任意组合结合使用,那么这将是一个开始。如果它不是优化的模式,那么它只会退回到常规矢量扫描。辅助键可以自动构建和缓存。
标签: r data.table subset inequality