2015-11-12 49 views
5

說我有兩個表:如何使用data.table執行「setdiff」合併?

library(data.table) 
set.seed(1) 

tab1 <- data.table(
    let = rep(letters[1:2], each = 3), 
    num = rep(1:3, 2), 
    val = rnorm(6), 
    key = c("let", "num") 
) 

tab2 <- data.table(
    let = rep(letters[1:2], each = 2), 
    num = rep(1:2, 2), 
    val = rnorm(4), 
    key = c("let", "num") 
) 

表1:

> tab1 
    let num  val 
1: a 1 -0.6264538 
2: a 2 0.1836433 
3: a 3 -0.8356286 
4: b 1 1.5952808 
5: b 2 0.3295078 
6: b 3 -0.8204684 

表2:

> tab2 
    let num 
1: a 1 
2: a 2 
3: b 1 
4: b 2 

有沒有一種方法來 「合併」 這些表,使得我得到的所有tab1的結果不在tab2?:

let num  val 
1: a 3 -0.8356286 
2: b 3 -0.8204684 
+0

相關文章:[如何加入(合併)數據幀(內部,外部,左,右)?](http://stackoverflow.com/questions/1299871) – zx8754

回答

11

在這種情況下,它相當於一個抗加盟

tab1[!tab2, on=c("let", "num")] 

setdiff()將只有第一行爲每個let,num。這標記爲v1.9.8,FR #547

+0

是爲了合併而像'setkey'一樣運行嗎? –

+0

鑑於我的例子已經設置了鍵,這可以簡化爲'tab1 [!tab2]' –

+0

@ColonelBeauvel,是的,它會進行臨時連接。當你有大量數據並且不想僅僅爲了加入而重新排序時非常有用。或者需要保留訂單時。還有哪些列正在被加入是明確的(不像'setkey'可能發生在代碼中的其他地方..而且這是一個連接操作的事實也很清楚。 – Arun

0

一個解決辦法是做一個合併,並刪除其中有來自tab2

d<-as.data.frame(merge(tab1,tab2,all=T)) 
t<-is.na(d[,4]) 
d[t,][,-4] 

let num  val.x 
3 a 3 -0.8356286 
6 b 3 -0.8204684 

值的行使用data.table

merge(tab1,tab2,all=T)[is.na(val.y),1:3,with=F] 

let num  val.x 
1: a 3 -0.8356286 
2: b 3 -0.8204684 
+0

這在這種情況下,但它可能不會如果我在我的數據中有NAs,則工作。 –