2015-06-10 26 views
2

我試圖做一些事情非常簡單,data.table一個表中的所有行,我失去了慣用的方式做到這一點我如何可以選擇匹配另一個表

library(data.table) 
set.seed(1) 
DT = data.table(a=sample(letters,1e5,T), b=sample(letters,1e5,T), c=rnorm(1e5)) 
DT2 = data.table(a=sample(letters,5,T), b=sample(letters,5,T)) 

DT2 
    a b 
1: k h 
2: e v 
3: f n 
4: m q 
5: w v 

我想選擇的行DTDT2相匹配。 因此,操作後的行數將始終小於初始表。

我想要的東西,這樣做:

> DT[paste(a,b) %chin% DT2[,paste(a,b)]] 
    a b   c 
    1: m q -0.4974579 
    2: e v -0.1325602 
    3: w v -1.8081050 
    4: m q 0.9025120 
    5: w v -0.4958802 
---    
729: f n 0.5604650 
730: f n -1.2607321 
731: m q 0.5146013 
732: m q -1.8329656 
733: k h -0.9752011 
> DT2[paste(a,b) %chin% DT[,paste(a,b)]] 
    a b 
1: e v 
2: f n 
3: k h 
4: m q 
5: w v 
> 
+0

你想要第一個結果,還是第二個?或兩者?如果是後者,那是不同的問題。 – BrodieG

+0

我想要這兩個,或者提醒我爲什麼我不能得到它 – statquant

回答

3

內加入應該做的:

setkey(DT, a, b)[DT2, nomatch=0] 

產地:

 a b   c 
    1: k h -1.6592442 
    2: k h 1.1946471 
    3: k h -0.8694933 
    4: k h 0.7789158 
    5: k h -1.3142607 
---    
729: w v -0.3516787 
730: w v 0.5272145 
731: w v -0.7531717 
732: w v 0.3352228 
733: w v 0.1182353 

如果你想知道在DT2哪些值存在於DT那麼:

unique(setkey(DT[, .(a, b)], a, b))[DT2, nomatch=0] 
+0

@statquant,我更新了答案,但沒有關於錯誤的更多細節,我無法提供額外的輸入。 – BrodieG

+0

實際上,如果我做'setkey(DT2,a,b)[DT]'我得到超過5行...所以這不是我更新的問題,所以它更清晰 – statquant

+0

@statquant你期望什麼? 'DT'不是唯一的,所以當然你會得到超過5行。也許我錯過了什麼? – BrodieG

相關問題