Operador == inconsistente en columnas lógicas en data.table

Por favor vea el siguiente ejemplo reproducible:

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 

Todo se ve bien y el recuento de valores “VERDADEROS” es el mismo para los 2 métodos. Ahora reemplace col B con uno nuevo.

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

¡El conteo de ‘T’ en la columna B es diferente! Es la misma columna pero un método da 3331 valores “VERDADEROS” y el otro 3019.

Cuando == se pasa por alto

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

Lo cual es correcto de nuevo

Puedo reproducirlo con data.table v1.94 y 1.9.5 en Windows 8.1 x64.


Aquí hay un ejemplo reproducible mucho más fácil sin runif() .

 require(data.table) ## 1.9.4+ DT = data.table(x = 1:5) DT[, y := x <= 2L] # xy # 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] # xy # 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! 

Ahora corregido en v1.9.5 en GitHub.

:= y set* ahora suelte las claves secundarias (nuevas en v1.9.4) para que DT[x==y] funcione nuevamente después de a := o set* sin necesidad de options(datatable.auto.index=FALSE) . Solo setkey() las claves secundarias correctamente. 23 pruebas agregadas. Gracias a user36312 por informar, # 885 .

Eche un vistazo a lo que @nrussell sugirió. Esto también podría ser un error, según @ Eddi. A continuación podría ser una solución temporal. También sugerido por @Arun. Por favor refiérase al intercambio de comentarios.

Caso 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's logical 6988 3012 0 

Caso 2

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

Caso 3

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