不提供时间间隔的一组变量的非等加入

问题描述:

我有两个不同提供者的数据集,记录不同ID的学生成绩。少数学生出现在两个数据集中。不提供时间间隔的一组变量的非等加入

DT1 = data.table(id = 1:6, 
       math = c(6.55, 7.39, 5.89, 9.70, 4.77, 5.30), 
       engl = c(8.55, 8.83, 9.20, 9.10, 4.32, 8.17), 
       hist = c(7.37, 3.39, 8.11, 2.10, 1.58, 6.65), 
       geog = c(10.0, 7.63, 2.37, 8.44, 6.35, 7.10)) 

DT2 = data.table(id = LETTERS[1:6], 
       math2 = c(6.55, 7.39, 5.88, 9.70, 4.17, 9.70), 
       engl2 = c(8.53, 6.83, 9.19, 9.10, 4.22, 9.10), 
       hist2 = c(7.39, 2.39, 8.12, 2.10, 1.58, 2.10), 
       geog2 = c(10.0, 7.43, 2.38, 8.44, 6.45, 8.44)) 

我想合并两者,才能知道的ID对应。要做到这一点,我必须匹配成绩。问题是不同的数据集有不同的舍入,因此,为了在两个数据集上找到学生,我必须匹配最接近的成绩。

截至目前,我做了以下

subj = names(DT2)[-1] # get the subjects 

#create interval on the grades, so I can run the non-equi join 
DT2[, paste0(subj, "_min") := lapply(.SD, function(x) x - 0.02), .SDcols = subj] 
DT2[, paste0(subj, "_max") := lapply(.SD, function(x) x + 0.02), .SDcols = subj] 

DTm = DT1[DT2, on = .(math >= math2_min, math <= math2_max, 
         engl >= engl2_min, engl <= engl2_max), nomatch = 0] 

总之,我创建等级±0.02的区间,做一个非球菌加盟,这导致了正确的答案(在上面的例子中我在DT2中有一个副本,这很好)。

但是,我想这样做而不提供间隔,因为我不知道要提供哪个间隔。

有没有办法做一个非最接近匹配的非等连接?当我说最接近我的意思时,找到math的最接近的值math2,然后在engl2的最接近的值engl。如果两个值都来自相同的观察值,那么它的匹配,如果不匹配,则不匹配。

+0

不幸的是我认为这是不容易的“非相等连接”功能。但是,你可以将它们四舍五入到0.02或0.04吗? (例如,'trunc(x * 50)/ 50'为0.02),然后加入平等?这可能会产生更多的匹配,但是如果您加入多个列,则匹配不正确的可能性会降低。 – r2evans

+0

在您的多维匹配中,“最接近的值”是什么意思? – eddi

+0

@eddi我正在编辑更精确 –

这似乎满足你最亲密的定义,但不匹配您的示例结果:

DT1[DT2, on = .(math = math2), roll = 'nearest', math.id := i.id][ 
    DT2, on = .(engl = engl2), roll = 'nearest', engl.id := i.id][ 
    math.id == engl.id] 
# id math engl hist geog math.id engl.id 
#1: 1 6.55 8.55 7.37 10.00  A  A 
#2: 3 5.89 9.20 8.11 2.37  C  C 
#3: 4 9.70 9.10 2.10 8.44  F  F 
#4: 5 4.77 4.32 1.58 6.35  E  E 
+0

鉴于我提供的时间间隔,我的例子结果是正确的答案,但它不是我正在寻找的答案。你的方法是。谢谢 –