Data.table: [bug]% na instrução% falha se a categoria contém letras maiúsculas e minúsculas

Criado em 15 mai. 2018  ·  6Comentários  ·  Fonte: Rdatatable/data.table

Na versão 1.11.2 , ao usar as instruções %in% e & juntas, %in% não respeita o fator que começa com uma letra maiúscula. Aqui está um exemplo:

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

[Emitir]
Depois de colocar a primeira letra em 'virginica' em maiúscula, a instrução %in% não pode retornar para ambos os grupos ao usar uma instrução & , veja abaixo:

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 

[Exemplos]
Tentei com alguns exemplos abaixo e eles funcionam bem.
Se eu fizer um subconjunto de grupos contendo apenas letras minúsculas, ambos os grupos serão encontrados.

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

Ou, se eu adicionar parênteses a qualquer uma das afirmações, ambos os grupos foram encontrados.

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 

Tentei esta instrução na função subset e funcionou.

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

Este recurso funciona em uma versão mais antiga do pacote data.table (use a versão 1.10.4-3 como exemplo aqui):

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 

[informações da sessão]

> 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

Comentários muito úteis

Eu criei um PR que (espero) corrige o problema. É uma regressão que foi introduzida por um dos meus próprios PRs.

Todos 6 comentários

@MarkusBonsch quer dar uma olhada? parece estranho

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.

Suspeito que esta seja pelo menos uma mensagem, possivelmente um aviso.

@ ddong63 Usar %in% para caracteres e fatores mistos é definitivamente algo a evitar, coagir ao tipo de dados adequado antes de usar match .

@HughParsonage será em breve, esperançosamente, há https://github.com/Rdatatable/data.table/pull/2734 pendente.

Muito, muito estranho. Vou investigar e consertar o mais rápido possível. Obrigado pelo relatório.

@jangorecki estava certo. Quando ambas as colunas têm o mesmo tipo de dados, seja caractere ou fator, funciona bem.
Agradeço muito sua atenção @MarkusBonsch

Eu criei um PR que (espero) corrige o problema. É uma regressão que foi introduzida por um dos meus próprios PRs.

Esta página foi útil?
0 / 5 - 0 avaliações