R data.table возвращает NA при использовании .I для получения номера строки - PullRequest
3 голосов
/ 02 мая 2020
library(data.table)

dt <- data.table(A=c(NA,3,5,0,1,2),B=c("foo","foo","foo","bar","bar","bar"))

dt
#>     A   B
#> 1: NA foo
#> 2:  3 foo
#> 3:  5 foo
#> 4:  0 bar
#> 5:  1 bar
#> 6:  2 bar
#simple filter
dt[,.I[A>1]]
#> [1] NA  2  3  6

dt[A>1,which=TRUE]
#> [1] 2 3 6

Я ожидал, что эти двое должны вернуть один и тот же результат.

1 Ответ

5 голосов
/ 02 мая 2020

В первом случае для поднабора используется 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...