2015-01-07 2 views
1

비슷한 주제가 많이 있지만 (예 : herehere) 나는 그 때 보았던 다른 질문과 약간 다른 목표를 가지고 있습니다. 참고로 R v 3.1.0을 사용하고 있습니다.좌표에서 거리를 기준으로 위치에 포인트 할당 R

두 행렬이 있습니다. 각각은 점에 대한 좌표를 포함합니다. 첫 번째 메시지 (A)는 2,107,377 점을 포함하고 두 번째 메시지 (B)는 26,577 점을 포함합니다.

각 지점에서 A이 가장 가까운 지점을 찾고 싶습니다. 즉, 포인트 1과 A 사이의 거리와 각 포인트는 B (26,577 거리)으로 계산하고 최소값을 저장하려고합니다. 나는 A (2,107,377 미니 마)의 모든 지점에 이것을하고 싶다. 목표는 A에있는 포인트를 그룹화하여 B에 가장 가까운 지점을 기준으로합니다. 따라서 B의 일부 지점은 할당되지 않습니다. 다른 사람 (다수)은 A에 여러 지점에 배정됩니다.

나는 시도했다 :

test = which.min(sapply(1:nrow(coordinates), function(i) 
      spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2), 
         longlat = TRUE))) 

을하지만, 메모리 할당 문제로 실행 (A> 16 메가 비트 벡터를 할당 할 수 없습니다).

for (i in 1:nrow(A)) { 
    minimum[i] = which.min(spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2), 
            longlat = TRUE)) 
} 

을하지만, 내가 기대하고있어, 단지 더 천천히, 같은 결과로 이어질 것입니다 :

지금 루프를 실행 해요.

내가 전혀 다른 접근법을 시도하기 전에 (아마도 raster 패키지를 배웠다.) 나는 누군가가 아이디어를 가지고 있는지를 알 것이다.

답변

1

메모리를 과부하가 걸리지 않도록 데이터를 작은 단위로 나누어보십시오. reproducible example 도움이 될 것입니다,하지만 난이 작업이 완료 작업 얻을 생각이 당신의 데이터가 너무 오래 걸리면, 당신은 또한 for 루프 대신에 foreach 루프를 사용하여 (병렬 컴퓨팅을 확인 할 수

library(sp) 
# X1 is a small example and X2 is a large example 
X1 <- cbind(pointX = 1:109, pointY = 1:109) 
Y1 <- cbind(x = 11:20, y = 11:20) 

X2 <- cbind(pointX = 2e4 + sample(2e6), pointY = 2e4 + sample(2e6)) 
Y2 <- cbind(x = sample(2e4), y = sample(2e4)) 

nearWrapper = function(X, Y, nBatches = 10){ 
    maxNumber = dim(X)[1] 
    batchNumbers <- split(0:maxNumber, ceiling(seq_along(0:maxNumber)/nBatches)) 
    out <- numeric(maxNumber) 
    for(batch in 1:(nBatches+1)){ 
     out[batchNumbers[[batch]]] <- apply(spDists(X[batchNumbers[[batch]],], Y), 1, which.min) 
     } 
    return(out) 
} 
smallOut <- nearWrapper(X1, Y1) 
largeOut <- nearWrapper(X2, Y2) 

을 너의 경우).