2015-11-12 23 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,则工作。 –