2017-10-17 1 views
1

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

は、残念ながら、私は簡単な「非エクイ参加」機能がないと思います。ただし、0.02または0.04に最も近い値に四捨五入することはできますか? (例えば、0.02に対して 'trunc(x * 50)/ 50')を実行し、等価性で結合しますか?これはより多くの一致を生成するかもしれませんが、複数の列に結合すると、不正確な一致の可能性が低くなります。 – r2evans

+0

あなたの多次元マッチの文脈において「最も近い値」は何を意味しますか? – eddi

+0

@eddi私はより正確に編集しています –

答えて

4

これが一番近いのあなたの定義を満たすように見えるが、あなたの例の結果と一致しません:

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

私が提供したインターバルでは、私の例は正解でしたが、私が探していた答えではありませんでした。あなたの方法はです。ありがとう –

関連する問題