Подтвердить что ты не робот

Оператор == несогласован в логических столбцах в data.table

См. следующий воспроизводимый пример:

library(data.table)
set.seed(123)
DT <- data.table(A=rep(0.3,10000))
DT[, B := runif(.N) < A]
DT[B == T, .N]
# [1] 3005
DT[, summary(B)]
#    Mode   FALSE    TRUE    NA's
# logical    6995    3005       0

Все выглядит нормально, а количество значений "ИСТИНА" одинаково для двух методов. Теперь замените col B на новый.

DT[, B := runif(.N) < A]
DT[B == T, .N]
# [1] 3331
DT[, summary(B)]
#    Mode   FALSE    TRUE    NA's
# logical    6981    3019       0 

Счетчик "T" в столбце B отличается! Это тот же столбец, но один метод дает 3331 "ИСТИННЫЕ" значения, а другой 3019.

Когда == обходит

DT[B != F, .N]
# [1] 3019
DT[, summary(B)]
#    Mode   FALSE    TRUE    NA's
# logical    6981    3019       0 

Что верное снова

Я могу воспроизвести его с помощью data.table v1.94 и 1.9.5 в Windows 8.1 x64.


Здесь намного проще воспроизводимый пример без runif().

require(data.table) ## 1.9.4+
DT = data.table(x = 1:5)
DT[, y := x <= 2L]
#    x     y
# 1: 1  TRUE
# 2: 2  TRUE
# 3: 3 FALSE
# 4: 4 FALSE
# 5: 5 FALSE

DT[y == TRUE, .N]
# [1] 2             <~~~~~~ correct result.

DT[, y := x <= 3L]
#    x     y
# 1: 1  TRUE
# 2: 2  TRUE
# 3: 3  TRUE
# 4: 4 FALSE
# 5: 5 FALSE

DT[y == TRUE, .N]
# [1] 2             <~~~~~~ incorrect result, should be 3!
4b9b3361

Ответ 1

Теперь зафиксировано в v1.9.5 на GitHub.

:= и set* теперь отбрасывают вторичные ключи (новые в версии 1.9.4), так что DT[x==y] снова работает после := или set* без необходимости options(datatable.auto.index=FALSE). Только setkey() правильно отбрасывал вторичные ключи. Добавлены 23 теста. Благодаря user36312 для отчетности # 885.

Ответ 2

Посмотрите, что предложил @nrussell. Это также может быть ошибкой, согласно @Eddi. Ниже может быть временная работа. Также предлагается @Arun. Пожалуйста, обратитесь к обмену комментариями.

Случай 1

> set.seed(123)
> DT <- data.table(A=rep(0.3,10000))
> DT[, B := runif(.N) < A]
> DT[B == T, .N]
[1] 3012
> DT[, summary(B)]
   Mode   FALSE    TRUE    NA 
logical    6988    3012       0 

Случай 2

> set.seed(123)
> DT[, B := runif(.N) < A]
> DT[B == T, .N]
[1] 3012
> DT[, summary(B)]
   Mode   FALSE    TRUE    NA 
logical    6988    3012       0 

Случай 3

> set.seed(123)
> DT[, B := runif(.N) < A]
> DT[B != F, .N]
[1] 3012
> DT[, summary(B)]
   Mode   FALSE    TRUE    NA 
logical    6988    3012       0