Data.table: [bug]% dans l'instruction% échoue si la catégorie contient à la fois des lettres minuscules et majuscules

Créé le 15 mai 2018  ·  6Commentaires  ·  Source: Rdatatable/data.table

Dans la version 1.11.2 , lorsque vous utilisez les instructions %in% et & ensemble, %in% ne respecte pas le facteur commençant par une lettre majuscule. Voici un exemple:

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

[Publier]
Après avoir mis la première lettre en majuscule dans 'virginica', l'instruction %in% ne peut pas revenir aux deux groupes lors de l'utilisation d'une instruction & , voir ci-dessous:

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 

[Exemples]
J'ai essayé avec quelques exemples ci-dessous et ils fonctionnent bien.
Si je sous-ensemble sur des groupes contenant uniquement des minuscules, les deux groupes ont été trouvés.

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

Ou, si j'ajoute des parenthèses à l'une ou l'autre des déclarations, les deux groupes ont été trouvés.

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 

J'ai essayé cette déclaration dans subset fonction et il fonctionne.

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

Cette fonctionnalité fonctionne dans une ancienne version du package data.table (utilisez la version 1.10.4-3 comme exemple ici):

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 

[informations sur la session]

> 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

Commentaire le plus utile

J'ai créé un PR qui (espérons-le) résout le problème. C'est une régression qui a été introduite par l'un de mes propres PR.

Tous les 6 commentaires

@MarkusBonsch voulez- vous jeter un coup d'œil? semble étrange

Utilisation de 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.

Je soupçonne que cela devrait être au moins un message, peut-être un avertissement.

@ ddong63 Utiliser %in% pour un caractère et un facteur mixtes est certainement quelque chose à éviter, obliger à un type de données approprié avant d'utiliser match .

@HughParsonage ce sera bientôt, espérons-le, il y a https://github.com/Rdatatable/data.table/pull/2734 en attente.

Très très étrange. Je vais enquêter et réparer dès que possible. Merci pour le rapport.

@jangorecki avait raison. Lorsque les deux colonnes ont le même type de données, caractère ou facteur, cela fonctionne correctement.
J'apprécie beaucoup votre attention @MarkusBonsch

J'ai créé un PR qui (espérons-le) résout le problème. C'est une régression qui a été introduite par l'un de mes propres PR.

Cette page vous a été utile?
0 / 5 - 0 notes