2つの異なるプロバイダの2つのデータセットがあり、異なる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))
ids対応を知るために、両方をマージしたい。そうするために、私は成績に合わせなければなりません。問題は、異なるデータセットが異なる丸めを持つため、両方のデータセットで生徒を見つけるために、私は最も近い成績に合致する必要があります。今、私は要約すると、以下の
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
に、engl
の最も近い値をengl2
にそれぞれ見つけてください。両方の値が同じ観測値からのものであれば、それは一致し、一致しない場合は一致しない。
は、残念ながら、私は簡単な「非エクイ参加」機能がないと思います。ただし、0.02または0.04に最も近い値に四捨五入することはできますか? (例えば、0.02に対して 'trunc(x * 50)/ 50')を実行し、等価性で結合しますか?これはより多くの一致を生成するかもしれませんが、複数の列に結合すると、不正確な一致の可能性が低くなります。 – r2evans
あなたの多次元マッチの文脈において「最も近い値」は何を意味しますか? – eddi
@eddi私はより正確に編集しています –