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