Как сгруппировать данные по расстоянию LatLong в R

У меня есть функция расстояния (lat1,lon1, lat2,lon2), которая рассчитывает расстояние 2 точки.

Предположим, у меня есть датафрейм с некоторыми точками и значениями:

n<-c(lon = -1.729219, lat = 29.730836)
o<-c(lon = -5.041928, lat = 28.453022)
e<-c(lon = -2.700067, lat = 29.198922)
s<-c(lon = -5.212864, lat = 28.531739)
centro<-matrix(c(n,o,e,s), ncol=2, byrow=TRUE)
d<-data.frame(c=centro, amount=c(3.5,3.5,3.5,3.5), count=c(12,12,12,12))
colnames(d)<-c('lon','lat','amount','count')

Я хочу получить новый набор фреймов со значениями, агрегированными по ближайшему из них (мне все равно, какой)

Предположим, у меня есть радиус 10 км, а n и o на расстоянии 7, а e и s на расстоянии 20 от любой другой точки. Я ожидаю новый фрейм данных с 3 значениями: e, s и новым значением с количеством и посчитайте сумму остальных 2 и lat и long либо из n, либо из o.

Я предполагаю, что есть простой способ сделать это в R, но я не смог его найти.

Спасибо

2 ответа

Я полагаю, что если у вас есть расстояния между точками, вы можете использовать hclust для кластеризации точек. Затем используйте cutree и установите аргумент h, чтобы разрезать группы на желаемом расстоянии. Вы можете использовать группы для объединения.

Может быть, что-то вроде этого (я не знаю, правильный ли вывод, но используя эти координаты, он дает вам расстояния порядка сотен километров)

#Calculate the distances and name them
distance <- (distm(centro))
row.names(distance) <- c("n", "o", "e", "s")
colnames(distance) <- c("n", "o", "e", "s")
#Use agnes function because it accepts a matrix
#And convert it to hclust objet to use cutree
library(cluster)
clusters <- as.hclust(agnes(distance, diss = T))
d$group <- cutree(clusters, h = 210000)
#Finally use plyr to agregate
library(plyr)
ddply(d, .(group), 
      function(x) data.frame(lon = x$lon[1], lat = x$lat[1], 
                             amount = sum(x$amount), count = sum(x$count)))

НТН

Для расчета расстояний между географическими координатами вы можете использовать функцию spDists из пакета sp. Из документации:

spDists возвращает полную матрицу расстояний в метрике точек, если longlat=FALSE, или в километрах, если longlat=TRUE; он использует spDistsN1 в том случае, если точки двумерные. В случае spDists(x,x) он вычислит все n x n-расстояния, а не достаточное n x (n-1)

Обратите внимание, что эта функция будет работать только в том случае, если ваши объекты представлены пространственными классами, предоставляемыми sp-пакетом (в вашем случае - SpatialPointsDataFrame). Небольшой пример R:

library(sp)
data(meuse)
# Convert the data.frame meuse to SpatialPointsDataFrame
coordinates(meuse) = c("x","y")
spDists(meuse)

Обратите внимание, что в вашем случае вы хотите установить входной аргумент longlat функции spDists равным TRUE, чтобы получить большие окружные расстояния. Эта функция, вероятно, отлично работает для не слишком больших наборов данных. Для больших наборов данных это может быть медленнее. Если вам действительно нужно что-то быстрое, вы можете взглянуть на Rcpp, чтобы написать цикл на C++.

Другие вопросы по тегам