匹配条件子集上的数据集

时间:2020-01-30 14:15:06

标签: r

当匹配2个数据集时,是否可以以某种方式指定匹配项,以使如果 至少 其中之一是第一数据集的观测值与第二数据集匹配满足条件吗?

假设我有以下两个data.tables:

dt1<- data.table(c1=c(rep('a', 2), rep('b', 2), rep('c', 2)), 
                 c2=c('x','y','x','y','x','z'),
                 c3.min = c(rep(0,3), rep(-1,3)),
                 c3.max = c(rep(10,3), rep(11,3)),
                 x= (1:6))

dt2 <- data.table(c1=c(rep('a', 3), rep('b', 3), rep('c', 4)), 
                  c2=c(rep(c('x','y'), 5)),
                  c3=c(-1, 2, 0, 10, 11, -1, 3, 6, 3, 12),
                  y= (1:10))

我有3个要匹配dt1和dt2的条件,第三个条件是一个范围。如果我仅按这三个条件进行正常合并,我将得到:

> dt2[dt1, on=.(c1,
+               c2,
+               c3 <= c3.max,
+               c3 >= c3.min), nomatch=NA ]

   c1 c2 c3  y c3.1 x
1:  a  x 10  3    0 1
2:  a  y 10  2    0 2
3:  b  x 10 NA    0 3
4:  b  y 11  4   -1 4
5:  b  y 11  6   -1 4
6:  c  x 11  7   -1 5
7:  c  x 11  9   -1 5
8:  c  z 11 NA   -1 6

如您所见,来自dt1的x=3x=6的观测值不匹配。我主要关心的是,即使我必须放松某些条件,也要为dt1中的尽可能多的观测值找到至少一个匹配项。因此,我想知道是否有3种条件中至少有dt1与dt2匹配的比赛?

我可以编写一个循环,但是实际上我的2个数据集比这个要大得多(第一个数据集具有10K个观测值,第二个数据集具有30万个观测值),我总共有4个条件,因此我正在寻找更多有效的方法。

谢谢!

1 个答案:

答案 0 :(得分:2)

我对这类问题的第一个直觉是使用sqldf包,因为我们需要使用OR个条件(而不是AND个条件)加入。

library(sqldf)
names(dt1) <- c("c1", "c2", "c3_min", "c3_max", "x") # need to get rid of the "."

query1 <- "select * from dt1
left join dt2 
on (dt1.c1 = dt2.c1) or (dt1.c2 = dt2.c2) or (dt2.c3 between dt1.c3_min and dt1.c3_max)"

sqldf(query1)