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