2016-07-29 6 views
7

Wie kann ich eine Faktorvariable mit einer doppelten Variable in einem Fall filtern, aber nicht in einem anderen?Filterung auf Faktorvariable mit Doppelvariable in R data.table

Beispieldaten unter:

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 

Warum funktioniert das ...

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

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

... aber dies auf einen Fehler gibt?

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

Scheint ein bisschen inkonsequent und könnte ein Fehler sein?

+0

Ich bekomme die richtige Ausgabe .... – Jaap

+0

Ich bekomme den gleichen Fehler: R Version 3.3.0 (2016-05-03), data.table_1.9.6 – zx8754

+0

Bitte fügen Sie die Ausgabe von 'sessionInfo()' zu deinem Posten. Sieht so aus, als wäre dies in data.table_1.9.7 behoben. – zx8754

Antwort

9

Der Unterschied ist, dass das zweite Beispiel durch automatische Indexierung optimiert wird, die diesen Fehler auslöst. Sie können diese Funktion wie folgt ausschalten:

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

Dann wird ein Basis-R-Vektor-Scan verwendet und es gelten die üblichen Zwangsregeln. Von 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 

Das Problem fixed in data.table Version 1.9.7 wurde.