2015-02-09 3 views
4

Оператор %in% является оберткой для функции соответствия, возвращающей «вектор той же длины, что и x». Например:Использование совпадения внутри i данных.table

> match(c("a", "b", "c"), c("a", "a"), nomatch = 0) > 0 
## [1] TRUE FALSE FALSE 

При использовании в i из data.table, однако

(dt1 <- data.table(v1 = c("a", "b", "c"), v2 = "dt1")) 
    v1 v2 
1: a dt1 
2: b dt1 
3: c dt1 
(dt2 <- data.table(v1 = c("a", "a"), v2 = "dt2")) 
    v1 v2 
1: a dt2 
2: a dt2 
dt1[v1 %in% dt2$v1] 
    v1 v2 
1: a dt1 
2: a dt1 

дубликаты получены. Если ожидаемое поведение %in% в пределах i из data.table не дают тот же результат, как

dt1[dt1$v1 %in% dt2$v1] 
    v1 v2 
1: a dt1 

т.е. без дубликатов?

+1

Я получаю без дубликатов с помощью 'data.table_1.9.5' – akrun

+1

Да, я тоже. Это похоже на ошибку, которая уже была исправлена. BTW, 'data.table' имеет специальный метод для сопоставления символов, называемый'% chin% ', поэтому вы могли бы попробовать' dt1 [v1% chin% dt2 $ v1] ' –

+0

Я использовал' data.table_1.9.4' с ' R версии 3.1.2 (2014-10-31) 'on' Платформа: x86_64-w64-mingw32/x64 (64-разрядная) ' – Jens

ответ

2

Это была ошибка в data.table V < 1.9.5 автоматическое индексирование, которое было зафиксировано в V> = 1.9.5.

я могу думать о 3-х возможных путей их устранения:

  1. Отключение автоматического индексирования и использования базы R %in% как в

    options(datatable.auto.index = FALSE) 
    dt1[v1 %in% dt2$v1] 
    ## v1 v2 
    ## 1: a dt1 
    
  2. Использование встроенного %chin% оператора, более эффективным и Безразлично У этой ошибки (работает только на сравнение векторных векторов)

    dt1[v1 %chin% dt2$v1] 
    ## v1 v2 
    ## 1: a dt1 
    
  3. Установить разрабатываемую версию из Github (Закройте все сеансы R первый и открыть только один)

    library(devtools) 
    install_github("Rdatatable/data.table", build_vignettes = FALSE) 
    library(data.table) 
    dt1 <- data.table(v1 = c("a", "b", "c"), v2 = "dt1") 
    dt2 <- data.table(v1 = c("a", "a"), v2 = "dt2") 
    dt1[v1 %in% dt2$v1] 
    ## v1 v2 
    ## 1: a dt1 
    
Смежные вопросы