서로 다른 두 공급자의 두 데이터 세트가 있으며 서로 다른 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로 반올림 할 수 있습니까? (예 :'trunc (x * 50)/50' = 0.02) 평등하게 결합 하시겠습니까? 이렇게하면 더 많은 일치가 생성 될 수 있지만 여러 열을 결합하면 일치하지 않을 확률이 줄어 듭니다. – r2evans
다차원 일치의 맥락에서 "가장 가까운 값"은 무엇을 의미합니까? – eddi
@eddi 더 정밀하게 편집 중입니다. –