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