我的最终目标是基于欧几里得距离,使用ggplot2软件包中的geom_path将一组建筑物的所有最近邻居连接起来。我需要帮助编写一个循环,以便尽可能轻松地绘制所有邻居。
我已经创建了一个名为'kmnew'的距离矩阵(以公里为单位),用于北京市的三种建筑物:B(x2)、D(x2)和L(x1)。
这会返回以下错误(不确定原因):
我将此附加到名为newbjdata的原始数据框中:
返回的函数
我随后通过ggmap获取我的地图:
我的最终目标是使用ggplot包中的geom_path函数将最近邻居映射到一个图上。
例如,类型为B的第一座建筑物(第1行)的最近邻居是类型为L的第一座建筑物(第5行)。显然,我可以通过对数据帧中这两行进行子集操作来绘制这条线。
我已经创建了一个名为'kmnew'的距离矩阵(以公里为单位),用于北京市的三种建筑物:B(x2)、D(x2)和L(x1)。
B B D D L
B NA 6.599014 5.758531 6.285787 3.770175
B NA NA 7.141096 3.873296 5.092667
D NA NA NA 3.690725 2.563017
D NA NA NA NA 2.832083
L NA NA NA NA NA
我尝试通过声明一个矩阵并使用循环来确定每栋建筑物的最近邻居:
nn <- matrix(NA,nrow=5,ncol=1)
for (i in 1:nrow(kmnew)){
nn[i,] <- which.min(kmnew[i,])
}
这会返回以下错误(不确定原因):
Error in nn[i, ] <- which.min(kmnew[i, ]) : replacement has length zero
但似乎对nn返回了正确答案:
[,1]
[1,] 5
[2,] 4
[3,] 5
[4,] 5
[5,] NA
我将此附加到名为newbjdata的原始数据框中:
colbj <- cbind(newbjdata,nn)
返回的函数
Name Store sqft long lat nn
1 B 1 1200 116.4579 39.93921 5
2 B 2 750 116.3811 39.93312 4
3 D 1 550 116.4417 39.88882 5
4 D 2 600 116.4022 39.90222 5
5 L 1 1000 116.4333 39.91100 NA
我随后通过ggmap获取我的地图:
bjgmap <- get_map(location = c(lon = 116.407395,lat = 39.904211),
zoom = 13, scale = "auto",
maptype = "roadmap",
messaging = FALSE, urlonly = FALSE,
filename = "ggmaptemp", crop = TRUE,
color = "bw",
source = "google", api_key)
我的最终目标是使用ggplot包中的geom_path函数将最近邻居映射到一个图上。
例如,类型为B的第一座建筑物(第1行)的最近邻居是类型为L的第一座建筑物(第5行)。显然,我可以通过对数据帧中这两行进行子集操作来绘制这条线。
ggmap(bjgmap) +
geom_point(data = colbj, aes(x = long,y = lat, fill = factor(Name)),
size =10, pch = 21, col = "white") +
geom_path(data = subset(colbj[c(1,5),]), aes(x = long,y = lat),col = "black")
然而,我需要一个像循环一样工作的解决方案,但我不知道如何实现,因为我需要引用nn列并将其参考回n次的long lat数据。 我完全相信我没有使用最有效的方法,所以我开放接受其他建议。非常感谢任何帮助。