簡體   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