如何使用data.table执行“ setdiff”合并?

问题描述 投票:7回答:2

说我有两个表:

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
r data.table
2个回答
13
投票

在这种情况下,它等效于anti join

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

但是tab1[!tab2, on=c("let", "num")] 对于每个setdiff()只会是第一行。标记为v1.9.8,let,num


0
投票

一种解决方案是合并并从FR #547中删除有值的行>

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
© www.soinside.com 2019 - 2024. All rights reserved.