2013-12-15 2 views
1

나는 사람의 주소 좌표 (addresses)와 특정 위치의 강우 좌표를 포함하는 두 개의 데이터 세트 (rain)를 가지고 있습니다. 좌표는 표준 위도와 경도입니다. 가장 가까운 강우 위치에 각 주소를 일치시키고 두 좌표 사이의 구형 거리를 사용하여 "가장 가까운"좌표를 결정하여이 두 세트를 병합하고 싶습니다. 순진한 방법은 각 주소와 각 강수량 위치 사이의 모든 쌍 방향 거리를 계산하고 최소값을 유지하는 것입니다. 그러나 데이터 세트가 상당히 크기 때문에 계산을 효율적으로하는 또 다른 방법이 있는지 궁금합니다.좌표 퍼지 매칭

나는 거리 계산에 지형 패키지를 사용하고 있습니다.

다음은 데이터의 하위 집합입니다.

rain <- structure(list(lat = c(-179.75, -179.75, -179.75, -179.75, -179.75, 
-179.75, -179.75, -179.75, -179.75, -179.75), lon = c(71.25, 
68.75, 68.25, 67.75, 67.25, 66.75, 66.25, 65.75, 65.25, -16.75 
), rainfall = c(0, 4.9, 4.6, 4.9, 8.9, 15.2, 24.2, 16.3, 12.2, 
365.4)), .Names = c("lat", "lon", "rainfall"), class = "data.frame", row.names = c(NA, 
-10L)) 


addresses <- structure(list(address_lat = c(-175.33, -175.20, -177.65, -174.10, -175.80, 
-179.50, -179.23, -179.12, -178.75, -174.77), address_lon = c(70.25, 
69.75, 62.23, 60.50, 66.25, 61.75, 62.54, 63.70, 61.45, -15.80), 
person_id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)), .Names = c("address_lat", "address_lon",  
"person_id"), class = "data.frame", row.names = c(NA, -10L)) 

한 세트에는 300,000 개의 고유 좌표 쌍이 있고 다른 세트에는 80,000 개 이상의 고유 좌표 쌍이 있습니다. 내가 가지고있는 유일한 아이디어는 두 개의 for 루프를 사용하는 것입니다. 하나는 주소 좌표 쌍 목록을 실행하고 다른 하나는 각 주소에서 모든 강우 위치까지의 거리를 계산 한 다음 가장 작은 값을 유지하는 것입니다.

+0

놀 수있는 데이터를 제공해 주시겠습니까? 또한 현재 코드와 현재 실행 시간을 표시 할 수 있습니까? –

+0

님이 OP에 수정 사항을 추가했습니다. – aesir

답변

3

먼저 위도와 경도에 대한 열 레이블을 반대로해야한다고 말해야합니다. 그렇지 않으면 위도가 -90 미만이됩니다. :-) 나는 나의 해결책을 위해 이것을 아래에했다.

library(geosphere) 

D = distm(addresses[, 1:2], rain[, 1:2]) 
# 
cbind(addresses, rain[apply(D, 1, which.min),]) 

먼저 거리 매트릭스를 형성합니다. 이 행렬의 각 행은 주소 중 하나에서 강우 관측치까지의 거리를 나타냅니다. 우리는 which.min을 사용하여 각 행에서 가장 작은 항목을 추출한 다음이를 사용하여 강우 데이터에 색인을 붙입니다.

+0

굉장합니다. 정확히 내가 원했던 것. 정말 고마워. – aesir

+0

나는 패키지 distm이 완성을 위해 오는 패키지를 여기에 넣는 것을 제안 할 것이다. –

+0

완료. OP가 이미 언급 했음에도 불구하고 패키지 이름 (지구권)을 포함하도록 답변을 업데이트했습니다. – DataWookie