【发布时间】:2017-12-06 05:30:50
【问题描述】:
我想弄清楚当我在data.table package 中使用索引 in R 时如何执行logical operators?
以下是示例。我创建了一个名为dt 的datatable。然后将var2 作为我的datatable 中的键:
> dt = data.table(var1 = rep(LETTERS[1:5],2), var2 = seq(1,20, 2), var3 = ceiling(rnorm(10, 3, 2)))
> dt
var1 var2 var3
1: A 1 5
2: B 3 3
3: C 5 0
4: D 7 6
5: E 9 3
6: A 11 4
7: B 13 2
8: C 15 1
9: D 17 3
10: E 19 7
> setkey(dt, var2)
所以现在我想确定我已经定义的key (var2) 中的所有值,它们是less than 10 ( <10)。做以下尝试给我errors。
> dt[ < 10]
Error: unexpected '<' in "dt[ <"
> dt[ .< 10]
Error in eval(expr, envir, enclos) : object '.' not found
> dt[ .(< 10)]
我的期望是:
var1 var2 var3
1: A 11 4
2: B 13 2
3: C 15 1
4: D 17 3
5: E 19 7
顺便说一句,我知道只要做dt[var2 <10] 我就会得到结果。但是请考虑我想在data.table 中获得索引的概念,并理解并知道如何做到这一点,而无需在我的每个命令中调用key(var2)!
非常感谢任何有关解释的帮助。
【问题讨论】:
-
dt[var2 < 10]?解释是您需要将 something 指定为小于 10? -
@Gregor,我知道这一点,这很明显!但是索引的概念是我不需要每次都调用列名(键)。那么,在我的命令中不调用
var2怎么办? -
来自
?setkey或?key看起来你可以在桌子上调用key()来获取密钥,所以dt[dt[[key(dt)]] < 10]可以做到这一点。您可能还想编辑问题以表明您希望以编程方式执行此操作,而无需在命令中调用var2。 -
@Gregor 感谢您提供的信息。尽管您的答案给出了正确的输出,但由于
data.table中的indexing的概念是为了避免编写 LONG 命令,我希望应该有另一种更容易解决的方法。 -
恐怕
dt[J()]目前不适用于 non-equi 连接,因此您可以使用dt[J(0:9), nomatch = 0L]指定要连接的范围或执行dt[get(key(dt)) < 10]或dt[eval(as.name(key(dt))) < 10]或 Gregor 建议的内容。
标签: r indexing key data.table logical-operators