簡體   English   中英

子集data.table按邏輯列

[英]Subset data.table by logical column

我有一個帶邏輯列的data.table 為什么邏輯列的名稱不能直接用於i參數? 參見示例。

dt <- data.table(x = c(T, T, F, T), y = 1:4)

# Works
dt[dt$x]
dt[!dt$x]

# Works
dt[x == T]
dt[x == F]

# Does not work
dt[x]
dt[!x]

?data.table

高級:當i是單個變量名時,它不被視為列名的表達式,而是在調用范圍內求值。

因此dt[x]將嘗試在調用范圍內評估x (在這種情況下為全局環境)

您可以使用({force

dt[(x)]
dt[{x}]
dt[force(x)]

x在全局環境中未定義。 如果你嘗試這個

> with(dt, dt[x])
      x y
1: TRUE 1
2: TRUE 2
3: TRUE 4

會的。 或這個:

> attach(dt)
> dt[!x]
       x y
1: FALSE 3

編輯:

根據文檔, j參數采用列名,實際上:

> dt[x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[j = x]
[1]  TRUE  TRUE FALSE  TRUE

然后, i參數采用數值或邏輯表達式(例如x本身應該是),但是似乎(data.table)如果沒有以下內容,則無法將x視為邏輯x

> dt[i = x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[i = as.logical(x)]
      x y
1: TRUE 1
2: TRUE 2
3: TRUE 4

這也應該起作用,並且可以說是更自然的:

setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM