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