2017-02-21 11 views
1

큰 데이터 세트로 작업하고 있으며 8GB RAM이있는 로컬 시스템에서 지형 공간 분석을 실행하려고합니다. 내 컴퓨터의 리소스를 초과 한 것처럼 보였고 모델을 최적화하여 내 컴퓨터에서 실행할 수 있는지 궁금합니다.거리를 최적화하십시오 distHaversine 모델에서 큰 df에 대한 R

area <- data.frame(area = c('Baker Street','Bank'), 
        lat = c(51.522236,51.5134047), 
        lng = c(-0.157080, -0.08905843), 
        radius = c(100,2000) 
) 

stop <- data.frame(station = c('Angel','Barbican','Barons Court','Bayswater'), 
        lat = c(51.53253,51.520865,51.490281,51.51224), 
        lng = c(-0.10579,-0.097758,-0.214340,-0.187569), 
        postcode = c('EC1V','EC1A', 'W14', 'W2')) 



library(geosphere) 


datNew = lapply(1:nrow(area), function(i) { 

    df = stop 

    df$dist = distHaversine(df[,c("lng", "lat")], 
          area[rep(i,nrow(df)), c('lng','lat')]) 

    df$in_circle = ifelse(df$dist <= area[i, "radius"], "Yes", "No") 

    df$circle_id = area[i, "area"] 

    df 

}) 

datNew = do.call(rbind, datNew) 

require(dplyr)  
datNew <- datNew %>% 
    group_by(station) %>% 
    slice(which.min(dist)) 

는 거리를 계산하고 내가 area의 수에 의해 stations의 수를 곱와 끝까지하지 않도록 다음 station에 의해 station의 최소 거리를 찾을 수 있습니까? 아니면 적은 리소스를 소비하는 방식으로 이것을 실행하거나 작업을 분할하여 RAM에 맞출 수있는 또 다른 솔루션이 있습니까?

답변

1

gapp()를 lapply 함수에서 끝내려고 했습니까? 다음 반복을위한 메모리 공간을 확보합니다. 이 병에 도움이 다시이 응답 tommorow에 와서하지 않는 경우, 바로 회신 해 주시기 바랍니다 :)

편집 :

난 당신이 마음이 있었다면 잘 모릅니다

그러나 여기 당신이가는 :

library(geosphere) 
library("plyr") 
library("magrittr") 

area <- data.frame(area = c('Baker Street','Bank'), 
        lat = c(51.522236,51.5134047), 
        lng = c(-0.157080, -0.08905843), 
        radius = c(100,2000) 
) 

stop <- data.frame(station = c('Angel','Barbican','Barons Court','Bayswater'), 
        lat = c(51.53253,51.520865,51.490281,51.51224), 
        lng = c(-0.10579,-0.097758,-0.214340,-0.187569), 
        postcode = c('EC1V','EC1A', 'W14', 'W2')) 

## In the function below you take an area one by one and then save the station which at the minimal 
## distance from the given area 

min.dist <- ddply(area, ~area, function(xframe){ 

    xframe <<- xframe 
    cat("Calculating minimum distance from area...", as.character(xframe$area), "\n") 

    dists <- distHaversine(xframe[, c("lat", "lng")], stop[ , c("lat", "lng")]) 
    stop.min <- stop[which(min(dists)==dists), ] 
    stop.min$area <- xframe$area 
    return(stop.min) 
    gc() 

}) 

min.dist # the new data frame 
+0

내가 가진 문제는 함수가 생성하는'df'가 너무 커서 그룹화를 수행 할 수 없다는 것입니다. 그래서 각 점까지의 거리를 계산하고 최소 점을 한 점씩 찾아야 만합니다. 그것이 의미가된다면 나중에 처리 할 수없는 커다란'df '를 만들지 마라. 아니면 내가 생각하지 못한 더 나은 해결책이 있을까요? – Davis

+0

매력처럼 작동했습니다. 도와 줘서 고마워! – Davis