2016-07-29 6 views
7

Jak mogę filtrować zmienną czynnikową za pomocą podwójnej zmiennej w jednym przypadku, ale nie w innym?Filtrowanie zmiennej czynnikowej za pomocą podwójnej zmiennej w R data.table

Przykładowe dane poniżej:

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 

Dlaczego to działa ...

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

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

... ale daje to błąd?

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

Wydaje się być nieco niekonsekwentny i może być błędem?

+0

Otrzymuję poprawne wyjście ... – Jaap

+0

Otrzymuję ten sam błąd: R wersja 3.3.0 (2016-05-03), data.table_1.9.6 – zx8754

+0

Proszę dodać wyjście 'sessionInfo()' do twojego posta. Wygląda na to, że zostało to naprawione w data.table_1.9.7. – zx8754

Odpowiedz

9

Różnica polega na tym, że drugi przykład jest zoptymalizowany przez automatyczne indeksowanie, które powoduje zgłoszenie tego błędu. Możesz wyłączyć tę funkcję w następujący sposób:

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

Następnie stosuje się skanowanie wektorowe w podstawie R i obowiązują zwykłe reguły dotyczące przymusu. Od 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 

problem został fixed w wersji 1.9.7 data.table.