2016-07-29 91 views
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 

爲什麼這項工作...

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

似乎有點不一致,可能是一個錯誤?

+0

我得到正確的輸出.... – Jaap

+0

我得到了同樣的錯誤:R版本3.3.0(2016-05-03),data.table_1.9.6 – zx8754

+0

請添加輸出'sessionInfo()'到您的帖子。看起來這是在data.table_1.9.7中修復的。 – zx8754

回答

9

不同之處在於第二個示例是通過自動索引進行優化的,這會引發此錯誤。可以關閉此功能是這樣的:

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

然後使用基礎R矢量掃描和通常的強制規則適用。從help("%in%")

Factors, raw vectors and lists are converted to character vectors, and then x and table are coerced to a common type

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

該問題已經在data.table版本1.9.7已經fixed