@ Jose Возможно, не так хорошо математически (с точки зрения кластеризации), но (в целом) лучший способ измерения расстояний большого круга (формулы Винсенти). И ~ в 8 раз быстрее для достижения (что я думаю, ваш желаемый результат) - (просто используя ваши образцы данных).
# Order the dataframe by Lon and Lat: ordered_df => data.frame
ordered_df <-
df %>%
arrange(., Longitude, Latitude)
# Scalar valued at how many clusters we are expecting => integer vector
k = 3
# Matrix of co-ordinates: coordinates => matrix
coordinates <-
ordered_df %>%
select(Longitude, Latitude) %>%
as.matrix()
# Generate great circle distances between points and Long-Lat Matrix: d => data.frame
d <- data.frame(Dist = c(0, distVincentyEllipsoid(coordinates)))
# Segment the distances into groups: cluster => factor
d$Cluster <- factor(cumsum(d$Dist > (quantile(d$Dist, 1/k))) + 1)
# Merge with base data: clustered_df => data.frame
clustered_df <- cbind(ordered_df, d)
Библиотеки и образцы данных:
library(geosphere)
library(dplyr)
df <- structure(list(Industries=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19),
Latitude = c(-23.8, -23.8, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9, -23.9),
Longitude = c(-49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.6, -49.7,-49.7, -49.7, -49.7, -49.7, -49.6, -49.6, -49.6, -49.6)),
class = "data.frame", row.names = c(NA, -19L))
start_time <- Sys.time()