在R的data.table中使用双变量对因子变量进行过滤

7

为什么有时候我可以使用双变量来筛选因子变量,而在其他情况下却不能?

以下是示例数据:

dt <- data.table(id=1:9,
                 var=factor(81:89))

# > dt
#    id var
# 1:  1  81
# 2:  2  82
# 3:  3  83
# 4:  4  84
# 5:  5  85
# 6:  6  86
# 7:  7  87
# 8:  8  88
# 9:  9  89

为什么这个有效...
dt[id %in% 1:7 & var %in% c(82, 84)]

#    id var
# 1:  2  82
# 2:  4  84

...但这会导致错误吗?

dt[var %in% c(82, 84)]

# Error in bmerge(i, x, leftcols, rightcols, io <- FALSE, xo, roll = 0,  : 
#  x.'var' is a factor column being joined to i.'V1' which is type 'double'.
# Factor columns must join to factor or character columns.`

似乎有点不一致,可能是个bug?

我得到了正确的输出... - Jaap
我遇到了相同的错误:R版本3.3.0(2016-05-03),data.table_1.9.6。 - zx8754
请在您的帖子中添加sessionInfo()的输出。看起来这个问题已经在data.table_1.9.7中得到了解决。 - zx8754
我正在使用 data.table 1.9.7 - Jaap
确实使用的是data.table版本1.9.6,看起来这个问题在1.9.7中已经被修复了。 - Bram Visser
1个回答

9

区别在于第二个示例通过自动索引进行了优化,这导致了此错误。您可以像这样关闭此功能:

dt[(var %in% c(82, 84))]
#   id var
#1:  2  82
#2:  4  84

然后使用基础R向量扫描,适用通常的强制转换规则。来自help("%in%"):

因子、原始向量和列表将被转换为字符向量, 然后 x 和 table 将被强制转换为通用类型

var <- factor(81:89)
var %in% c(82, 84)
#[1] FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

问题已在data.table版本1.9.7中得到修复


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接