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
@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.
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.