当匹配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=3
和x=6
的观测值不匹配。我主要关心的是,即使我必须放松某些条件,也要为dt1中的尽可能多的观测值找到至少一个匹配项。因此,我想知道是否有3种条件中至少有dt1与dt2匹配的比赛?
我可以编写一个循环,但是实际上我的2个数据集比这个要大得多(第一个数据集具有10K个观测值,第二个数据集具有30万个观测值),我总共有4个条件,因此我正在寻找更多有效的方法。
谢谢!
答案 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)