使用R data.table中的双变量过滤因子变量

Bra*_*ser 7 r data.table

为什么我可以在一种情况下使用双变量过滤因子变量,而不是在另一种情况下?

以下示例数据:

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
Run Code Online (Sandbox Code Playgroud)

为什么这样做......

dt[id %in% 1:7 & var %in% c(82, 84)]

#    id var
# 1:  2  82
# 2:  4  84
Run Code Online (Sandbox Code Playgroud)

......但这会出错?

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.`
Run Code Online (Sandbox Code Playgroud)

似乎有点不可能,可能是一个错误?

Rol*_*and 9

不同之处在于第二个示例是通过自动索引进行优化的,这会引发此错误.您可以像这样关闭此功能:

dt[(var %in% c(82, 84))]
#   id var
#1:  2  82
#2:  4  84
Run Code Online (Sandbox Code Playgroud)

然后使用基本R矢量扫描并应用通常的强制规则.来自help("%in%"):

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

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

data.table版本1.9.7中已修复此问题.