Использовать geosphere :: distm более эффективно? - PullRequest
0 голосов
/ 17 января 2020

Используя данные о местоположении магазинов, я пытаюсь найти «конкурентов», которые определяются как другие магазины на определенном расстоянии.

Я использую geo sphere::distm и некоторые матричные операции, как показано ниже , Проблема в том, что моя матрица довольно большая (100 000 X 100 000), и это занимает очень много времени (или моя память не поддерживает этот тип анализа). Будет ли способ сделать код ниже более эффективным? Входной файл выглядит так же, как locations_data (но больше). Желаемым выводом является таблица данных competitors, в которой каждый ряд содержит пары конкурентов. Я новичок в написании эффективных кодов на R и хотел попросить помощи.

locations_data<-cbind(id=1:100, longitude=runif(100,min=-180, max=-120), latitude=runif(100, min=50, max=85))

#require(geosphere)
mymatrix<-distm(locations_data[,2:3])

#require(data.table)
analyze_competitors<-function(mymatrix){
    mymatrix2<-matrix(as.numeric(mymatrix<1000000), nrow(mymatrix), ncol(mymatrix)) #
    competitors<-which(mymatrix2==1,arr.ind = T)
    competitors<-data.table(competitors)
    return(competitors)
}

competitors<-analyze_competitors(mymatrix)

1 Ответ

1 голос
/ 18 января 2020

Если вы хотите меньшую матрицу, рассмотрите возможность разделения данных с сеткой на основе долготы и / или широты. Например, это создает два новых столбца с метками для сетки 5 x 5.

#converting your example data to a tibble.
locations_data<-tibble::as_tibble(locations_data)
#create a numeric grid spanning the extent of your latitude and longitude
locations_data$long_quant<-findInterval(locations_data$longitude, quantile(locations_data$longitude,probs = seq(0,1,.2)), rightmost.closed=TRUE)
locations_data$lat_quant<-findInterval(locations_data$latitude, quantile(locations_data$latitude,probs = seq(0,1,.2)), rightmost.closed=TRUE)

Затем можно создать несколько меньших матриц, используя подмножество location_data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...