Есть ли эффективный способ сгруппировать близлежащие места по долготе и широте? - PullRequest
2 голосов
/ 06 ноября 2019

Я пытаюсь найти способ кластеризации нескольких адресов на основе близости. У меня есть широта и долгота, которая в этом случае идеальна, так как некоторые кластеры будут пересекать границы City / Zip. То, что я хотел бы использовать в качестве отправной точки, похоже на это, но до 10000 строк в таблице:

Hospital.Addresses <- tibble(Hospital_Name = c("Massachusetts General Hospital","MGH - Blake Building","Shriners Hospitals for Children — Boston","Yale-New Haven Medical Center", "Memorial Sloan Kettering", "MSKCC Urgent Care Center", "Memorial Sloan Kettering Blood Donation Room"),
  Address = c("55 Fruit St", "100 Blossom St", "51 Blossom St", "York St", "1275 York Ave", "425 E 67th St", "1250 1st Avenue Between 67th and 68th Streets"),
  City = c("Boston", "Boston", "Boston", "New Haven", "New York", "New York", "New York"),
  State = c("MA", "MA", "MA", "CT", "NY", "NY","NY"),
  Zip = c("02114","02114","02114", "06504", "10065", "10065", "10065"),
  Latitude = c(42.363230, 42.364030, 42.363090, 41.304507, 40.764390, 40.764248, 40.764793),
  Longitude = c(-71.068680, -71.069430, -71.066630, -72.936781, -73.956810, -73.957127, -73.957818))

Я бы хотел сгруппировать группы адресов, которые находятся в пределах ~ 1 мили друг от друга,потенциально без расчета расстояния Хаверсайна между 10000 отдельных точек. Мы могли бы потенциально упростить математику и приблизительно оценить 1 милю как 0,016 градуса широты или долготы.

Идеальным результатом было бы то, что проверяет 3 больницы в Бостоне в группе 1 (все в пределах 1 мили друг от друга), больница в Нью-Хейвене самостоятельно в группе 2 (не в пределах 1мили всего остального), и все 3 больницы в Нью-Йорке находятся в группе 3 (все в пределах 1 мили друг от друга).

Вместо group_by () я больше ищу group_near ().

Любые предложения приветствуются!

1 Ответ

2 голосов
/ 07 ноября 2019

На самом деле функция distm из пакета geosphere может обрабатывать 10000 пар всего за пару минут, на моей машине это не так уж плохо по сравнению со временем, которое потребовалось для написания этого решения. Матрица dist для 10000 случайных точек потребляет меньше гигабайта памяти.

Выполнение кластеризации с помощью hclust и использование матрицы расстояний, сгенерированной из пакета геосферы, может четко показать близость каждой точки.

#create fake data
lat<-runif(10000, min=28, max=42)
long<-runif(10000, min=-109, max=-71)
df<-data.frame(long, lat)

library(geosphere)

start<-Sys.time()
#create a distance matrix in miles
dmat<-distm(df)/1000*.62
print(Sys.time()-start)

#cluster
clusted<-hclust(as.dist(dmat))
#plot(clusted)
#find the clusters ids for 2 mile distances
clustersIDs<-(cutree(clusted, h=2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...