不提供时间间隔的一组变量的非等加入
问题描述:
我有两个不同提供者的数据集,记录不同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
。如果两个值都来自相同的观察值,那么它的匹配,如果不匹配,则不匹配。
答
这似乎满足你最亲密的定义,但不匹配您的示例结果:
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
鉴于我提供的时间间隔,我的例子结果是正确的答案,但它不是我正在寻找的答案。你的方法是。谢谢 –
不幸的是我认为这是不容易的“非相等连接”功能。但是,你可以将它们四舍五入到0.02或0.04吗? (例如,'trunc(x * 50)/ 50'为0.02),然后加入平等?这可能会产生更多的匹配,但是如果您加入多个列,则匹配不正确的可能性会降低。 – r2evans
在您的多维匹配中,“最接近的值”是什么意思? – eddi
@eddi我正在编辑更精确 –