Data.table: [bug]如果类别同时包含小写和大写字母,%in%语句将失败

创建于 2018-05-15  ·  6评论  ·  资料来源: Rdatatable/data.table

在版本1.11.2 ,当同时使用%in%&语句时, %in%不考虑以大写字母开头的因数。 这是一个例子:

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

[问题]
大写'virginica'中的第一个字母后,使用&语句时, %in%语句不能返回到两个组,请参见下文:

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 

[例子]
尝试了以下几个示例,它们工作正常。
如果我只在包含小写字母的组中子集,则发现两个组。

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

或者,如果我在任一语句中加上括号,则会找到两个组。

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 

我在subset函数中尝试了该语句,它起作用了。

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

此功能在较旧版本的data.table包中起作用(此处以版本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 

[会议信息]

> 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

最有用的评论

我创建了一个PR(希望)可以解决此问题。 这是我自己的一个PR引入的回归。

所有6条评论

@MarkusBonsch关心一下吗? 似乎很奇怪

使用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.

我怀疑这至少应该是一条消息,可能是警告。

@ ddong63%in%用于混合字符和因子绝对是要避免的事情,在使用match之前强制使用正确的数据类型。

@HughParsonage希望很快就会到来,有https://github.com/Rdatatable/data.table/pull/2734待处理。

非常非常奇怪。 我将尽快调查并修复。 感谢您的报告。

@jangorecki是正确的。 当两列具有相同的数据类型(字符或因子)时,它将正常工作。
非常感谢您的关注@MarkusBonsch

我创建了一个PR(希望)可以解决此问题。 这是我自己的一个PR引入的回归。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jameslamb picture jameslamb  ·  3评论

symbalex picture symbalex  ·  3评论

sengoku93 picture sengoku93  ·  3评论

arunsrinivasan picture arunsrinivasan  ·  3评论

tcederquist picture tcederquist  ·  3评论