[英]Error in selecting rows with “!” operator in data.table
我尝试使用!
选择行 算子
d = data.table(a = 1:3, b = c(TRUE, FALSE,FALSE))
d [b==FALSE]
# a b
# 1: 2 FALSE
# 2: 3 FALSE
d [!b]
# Error in eval(expr, envir, enclos) : object 'b' not found
如果它是一个表达式,就不应该对其求值吗?
在data.table
,当i
是符号时,它将在调用范围内进行评估(请参见idata.table i
参数说明),而不是在data.table的框架内。 这是因为我们允许使用另一个data.table子集(或联接)data.tables,即, i
可以是另一个data.table。
require(data.table)
dt1 = data.table(x=1:3, y=4:6)
dt2 = data.table(x=2:3, z=7:8)
dt1[dt2, on="x"] # dt2 needs to be looked up first in the calling scope
由于此功能, i
符号需要用()
包裹,以便将其视为一个表达式(与符号相对),这足以理解它需要在data.table的框架内求值。 那是:
dt1[, id := c(TRUE, FALSE, TRUE)]
dt1[(id)] # rows 1 and 3
当您使用!<symbol>
,“!” 被捕获并删除,然后首先对表达式的其余部分求值,然后再求“!” 被引入回来..(但是有效地完成了但没有实现中间数据),即
dt1[!dt2, on="x"]
通过首先计算dt1[dt2, on="x"]
的匹配行索引,然后获取对应于“!”的索引,计算匹配行索引。 通过采取差异。
因此,当与“!”一起使用时,我们将需要一个()
。 以及将其视为与符号相对的一种表达方式。
dt1[!(id)] # works
dt1[(!id)] # also works
通常,与使用另一个data.table进行子集设置的用法和优点相比,这种对data.table中的列作为逻辑向量进行子集设置的用法极为罕见。
当为i
参数实现更好的作用域规则时,这将变得更好。 参见#633 。
我们需要把它放在方括号内
d [!(b)]
# a b
#1: 2 FALSE
#2: 3 FALSE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.