Data.table: [bug]% in% -Anweisung schlägt fehl, wenn die Kategorie sowohl Klein- als auch Großbuchstaben enthält

Erstellt am 15. Mai 2018  ·  6Kommentare  ·  Quelle: Rdatatable/data.table

In Version 1.11.2 berücksichtigt %in% Faktor nicht, der mit einem Großbuchstaben beginnt, wenn %in% und & zusammen verwendet werden. Hier ist ein Beispiel:

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

[Problem]
Nach dem Großschreiben des ersten Buchstabens in 'virginica' kann die Anweisung %in% nicht zu beiden Gruppen zurückkehren, wenn eine Anweisung & (siehe unten):

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 

[Beispiele]
Versucht mit ein paar Beispielen unten und sie funktionieren gut.
Wenn ich nur Gruppen mit Kleinbuchstaben teile, wurden beide Gruppen gefunden.

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

Wenn ich der Anweisung eine Klammer hinzufüge, wurden beide Gruppen gefunden.

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 

Ich habe diese Anweisung in der Funktion subset ausprobiert und sie funktioniert.

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

Diese Funktion funktioniert in einer älteren Version des data.table-Pakets (verwenden Sie hier als Beispiel die Version 1.10.4-3 ):

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 

[Sitzungsinfo]

> 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

Hilfreichster Kommentar

Ich habe eine PR erstellt, die (hoffentlich) das Problem behebt. Es ist eine Regression, die von einem meiner eigenen PRs eingeführt wurde.

Alle 6 Kommentare

@ MarkusBonsch Lust auf einen Blick? scheint seltsam

Verwenden von 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.

Ich vermute, dass dies zumindest eine Nachricht sein sollte, möglicherweise eine Warnung.

@ ddong63 Die Verwendung von %in% für gemischte Zeichen und Faktoren ist definitiv zu vermeiden. Erzwingen Sie den richtigen Datentyp, bevor Sie match .

@ HughParsonage wird es hoffentlich bald sein, es steht https://github.com/Rdatatable/data.table/pull/2734 aus.

Sehr sehr seltsam. Ich werde so schnell wie möglich untersuchen und beheben. Danke für den Bericht.

@jangorecki hatte recht. Wenn beide Spalten denselben Datentyp haben, entweder Zeichen oder Faktor, funktioniert dies einwandfrei.
Vielen Dank für Ihre Aufmerksamkeit

Ich habe eine PR erstellt, die (hoffentlich) das Problem behebt. Es ist eine Regression, die von einem meiner eigenen PRs eingeführt wurde.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen