在版本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
@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引入的回归。
最有用的评论
我创建了一个PR(希望)可以解决此问题。 这是我自己的一个PR引入的回归。