2015-02-09 21 views
4

%in%運算符使用匹配的是匹配函數返回「相同的長度爲x的向量」的包裝。例如:i內的data.table

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

當內的data.table i使用,但是得到

(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%內的data.table i預期的行爲沒有給出相同的結果

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

即不重複?

+1

我得到它,而無需使用重複'data.table_1.9.5' – akrun 2015-02-09 14:25:52

+1

是啊,我也一樣。這看起來像一個已經修復的錯誤。順便說一句,'data.table'有一個名爲'%下巴%',所以你可以藏漢字符匹配的特殊方法嘗試'DT1 [V1%下巴%DT2 $ V1]' – 2015-02-09 14:27:29

+0

我用'data.table_1.9.4'用' [R版本3.1.2(2014年10月31日)''上的平臺:x86_64的-W64-的mingw32/64(64位)'' – Jens 2015-02-09 14:30:18

回答

2

這是data.table中的一個bug V < 1.9.5自動索引在V> = 1.9.5中固定。

我能想到的3級可能的解決方法:

  1. 禁用自動索引和

    options(datatable.auto.index = FALSE) 
    dt1[v1 %in% dt2$v1] 
    ## v1 v2 
    ## 1: a dt1 
    
  2. 使用使用基礎R %in%作爲內置%chin%運算符,它都更有效,更沒有按「T有這種錯誤(僅適用於字符向量比較)

    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