2017-10-17 5 views
1

서로 다른 두 공급자의 두 데이터 세트가 있으며 서로 다른 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로 반올림 할 수 있습니까? (예 :'trunc (x * 50)/50' = 0.02) 평등하게 결합 하시겠습니까? 이렇게하면 더 많은 일치가 생성 될 수 있지만 여러 열을 결합하면 일치하지 않을 확률이 줄어 듭니다. – 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

필자가 제시 한 결과는 필자가 제공 한 정확한 답변 이었지만, 내가 찾던 답변이 아니었다. 너의 방법은. 감사 –