繁体   English   中英

在data.table中使用“!”运算符选择行时出错

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM