В первом случае для поднабора используется base
R logi c; В последнем случае для поднабора используются немного отличающиеся логики data.table
c.
data.table
исключает NA
из фильтрации:
dt[A > 1]
# A B
# 1: 3 foo
# 2: 5 foo
# 3: 2 bar
# compare to base logic:
setDF(dt)
dt[dt$A > 1, ]
# A B
# NA NA <NA>
# 2 3 foo
# 3 5 foo
# 6 2 bar
setDT(dt)
Это можно увидеть в действии a добавьте немного диагностики к вашему первому утверждению:
dt[, {
idx = A > 1
print(idx)
print(seq_len(.N)[idx])
.I[A>1]
}]
# [1] NA TRUE TRUE FALSE FALSE TRUE
# [1] NA 2 3 6
# [1] NA 2 3 6
base
logi c - это то, что NA
означает «неизвестный», поэтому сохранять или удалять элемент на NA
индексы также неизвестны, поэтому на выходе должно быть NA
. From ?"["
:
NA при индексировании
При извлечении числовой, логический или символьный NA
индекс выбирает неизвестный элемент и возвращает NA
в соответствующем элементе. логического, целого числа, числа c, комплексного или символьного результата и NULL
для списка. (Возвращает 00
для необработанного результата.)
против. от ?data.table
:
i
целочисленные и логические векторы работают так же, как в [.data.frame
, за исключением того, что логические NA
s обрабатываются как FALSE
.