我正在尝试计算坐标对之间的距离,使用(例如)rgeos包中的gDistance函数相当容易。然而,我在解决以下问题时遇到了问题:在我的数据框中,我有关于不同类型的兴趣点(比如咖啡馆,快餐店和酒吧)的信息,我只对两个POI之间的距离感兴趣不同类型。
这就是我的数据框:
lat <- c(50.639342, 50.623727, 50.578924, 50.786729)
lon <- c(10.236543, 10.1896532, 10.587272, 10.776234)
type <- c("A", "A", "B", "C")
df <- data.frame(lat, lon, type)
我可以通过将df转换为空间对象来计算每对之间的距离...
if (!require(sp)) install.packages('sp')
library(sp)
sp.data <- df
coordinates(sp.data) <- ~lat+lon
...并使用gDistance函数获得成对的距离矩阵。
if (!require(rgeos)) install.packages('rgeos')
library(rgeos)
distance <- gDistance(sp.data, byid=T)
distance
1 2 3 4
1 0.00000000 0.04942147 0.3558949 0.5594545
2 0.04942147 0.00000000 0.4001350 0.6088076
3 0.35589488 0.40013500 0.0000000 0.2808728
4 0.55945447 0.60880759 0.2808728 0.0000000
接下来我要做的是分析不同类型的两点之间的距离。例如,我对咖啡店最近的邻居感兴趣,咖啡店本身就不是咖啡店。我的问题是我不知道如何使用成对数据。理想情况下,我会使用原始数据框中的type列为所有包含相同类型的点之间距离的单元分配NA,但我无法弄清楚如何执行此操作。
答案 0 :(得分:1)
您可以使用?outer
,试试这个:
lat <- c(50.639342, 50.623727, 50.578924, 50.786729)
lon <- c(10.236543, 10.1896532, 10.587272, 10.776234)
type <- c("A", "A", "B", "C")
df <- data.frame(lat, lon, type)
library(sp)
sp.data <- df
coordinates(sp.data) <- ~lat+lon
library(rgeos)
distance <- gDistance(sp.data, byid=T)
distance
sp.data$type # we will use columns from the original data frame as you want
# solution
colnames(distance) <- sp.data$type
rownames(distance) <- sp.data$type
distance[outer(rownames(distance), colnames(distance), "==")] <- NA
distance