Data.table: [error]% en la instrucción% falla si la categoría contiene letras mayúsculas y minúsculas

Creado en 15 may. 2018  ·  6Comentarios  ·  Fuente: Rdatatable/data.table

En la versión 1.11.2 , cuando se usan las declaraciones %in% y & juntas, %in% no respeta el factor que comienza con una letra en mayúscula. Aquí hay un ejemplo:

install.packages('data.table')
packageVersion("data.table")   # ‘1.11.2’
data("iris")
library(data.table)
iris <- data.table(iris)
iris$grp <- c('A', 'B')

[Asunto]
Después de poner en mayúscula la primera letra en 'virginica', la declaración %in% no puede regresar a ambos grupos cuando se usa una declaración & , consulte a continuación:

iris[, Species1 := factor(Species, levels = c('setosa', 'versicolor', 'virginica'), labels = c('setosa', 'versicolor', 'Virginica'))]

iris[Species1 %in% c('setosa', 'Virginica') & grp == 'B', table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 0          0         25 

[Ejemplos]
Probé con algunos ejemplos a continuación y funcionan bien.
Si hago un subconjunto de grupos que contienen solo minúsculas, se encontraron ambos grupos.

iris[Species1 %in% c('setosa', 'versicolor') & grp == 'B', table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 25         25          0 

O, si agrego paréntesis a cualquiera de las declaraciones, se encontraron ambos grupos.

iris[(Species1 %in% c('setosa', 'Virginica')) & grp == 'B', table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 25          0         25 
iris[Species1 %in% c('setosa', 'Virginica') & (grp == 'B'), table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 25          0         25 

Probé esta declaración en la función subset y funciona.

table(subset(iris, Species1 %in% c('setosa', 'Virginica') & grp == 'B')$Species1)
# setosa versicolor  Virginica 
# 25          0         25 

Esta característica funciona en una versión anterior del paquete data.table (use la versión 1.10.4-3 como ejemplo aquí):

devtools::install_version("data.table", version = "1.10.4-3", repos = "http://cran.us.r-project.org")

packageVersion("data.table")   # ‘1.10.4.3’
data("iris")
library(data.table)
iris <- data.table(iris)
iris$grp <- c('A', 'B')

iris[, Species1 := factor(Species, levels = c('setosa', 'versicolor', 'virginica'), labels = c('setosa', 'versicolor', 'Virginica'))]

iris[Species1 %in% c('setosa', 'Virginica') & grp == 'B', table(Species1)]
# Species1
# setosa versicolor  Virginica 
# 25          0         25 

[información de la sesión]

> sessionInfo()
R version 3.4.4 (2018-03-15)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.11.2

loaded via a namespace (and not attached):
[1] compiler_3.4.4 tools_3.4.4    yaml_2.1.18   
bug regression

Comentario más útil

He creado un PR que (con suerte) soluciona el problema. Es una regresión que fue introducida por uno de mis propios RP.

Todos 6 comentarios

@MarkusBonsch ¿te importaría echar un vistazo? parece extraño

Usando verbose = TRUE

Optimized subsetting with index 'grp__Species1'
on= matches existing index, using index
Coercing character column i.'Species1' to factor to match type of x.'Species1'. If possible please change x.'Species1' to character. Character columns are now preferred in joins.

Sospecho que esto debería ser al menos un mensaje, posiblemente una advertencia.

@ ddong63 Usar %in% para caracteres y factores mixtos es definitivamente algo que se debe evitar, forzar al tipo de datos adecuado antes de usar match .

@HughParsonage será pronto, con suerte, hay https://github.com/Rdatatable/data.table/pull/2734 pendiente.

Muy muy extraño. Investigaré y arreglaré lo antes posible. Gracias por el informe.

@jangorecki tenía razón. Cuando ambas columnas tienen el mismo tipo de datos, ya sea de carácter o factor, funciona bien.
Agradezco mucho su atención @MarkusBonsch

He creado un PR que (con suerte) soluciona el problema. Es una regresión que fue introducida por uno de mis propios RP.

¿Fue útil esta página
0 / 5 - 0 calificaciones