我有一个大型数据集(df((有300,000个房屋(,我有每个观测值的经度和纬度。下面(df1(是数据的前10个观察结果:
df1 <- read.table(sep=",", col.names=c("lat", "lon"), text="
53.543526,-8.047727
51.88029, -9.583830
52.06056, -9.488551
51.87087, -9.577604
51.89530, -8.454321
51.95688, -7.851760
53.37621, -6.392430
53.37719, -6.234660
51.88029, -9.583830
51.88145, -9.600894")
首先,我尝试使用以下方法将我的数据集(所有 300,000 个观测值(与一个数据点进行比较(计算数据框中两个长纬度坐标之间的距离(:
centre = c(53.543526, -8.089727)
distHaversine(df, centre)
# and
distm(df, centre, fun = distHaversine)
但是我一直收到错误:
.pointsToMatrix(x( 中的错误:纬度 <-90
我有两个问题:
如何计算数据帧"df"中 300,000 个观测值中的每一个到"中心"数据点的距离
假设我想计算每个房子到学校列表的距离(一个较小但较大的数据集 - 以数百为单位((例如下面的 df2(。如何计算每所房子到每所学校的距离,然后保持最小距离?
示例学校数据集:
df2 <- read.table(sep=",", col.names=c("lat", "lon"), text="
53.38271, -6.437433
53.34874, -6.131537
53.34449, -6.266856
53.34424, -6.267444
53.34648, -6.261414
53.64333, -8.208663")
提前感谢!
使用 geosphere
包中的distm
函数,它计算两个矩阵之间每个点之间的距离,其中每行表示df1
对象,列表示df2
对象:
library(geosphere)
distm(df1, df2)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 178968.962 213003.58 198172.550 198110.991 198746.488 20923.34
[2,] 385376.082 414721.59 400788.464 400717.802 401428.071 246442.51
[3,] 367573.615 397518.53 383398.252 383327.609 384038.877 224390.48
[4,] 385203.033 414495.46 400578.857 400508.198 401218.340 246836.89
[5,] 276963.269 302892.13 290037.267 289967.750 290660.977 194456.76
[6,] 221966.904 244628.53 232857.426 232790.237 233455.843 190049.84
[7,] 5028.478 29011.20 14323.587 14267.385 14857.496 203015.38
[8,] 22432.536 11830.79 5076.573 5141.969 4505.897 220278.46
[9,] 385376.082 414721.59 400788.464 400717.802 401428.071 246442.51
[10,] 387024.885 416408.72 402463.993 402393.330 403103.685 247508.26
至于提到的错误,我在使用distm
时没有收到任何错误
distm(df1, centre, fun = distHaversine)
[,1]
[1,] 4675.419
[2,] 247250.726
[3,] 225526.648
[4,] 247555.321
[5,] 186051.181
[6,] 176912.553
[7,] 189843.467
[8,] 207320.670
[9,] 247250.726
[10,] 248435.392
我也有类似的问题。问题是经度和纬度是字符列。将它们转换为数字列解决了问题。
我认为你的纬度坐标很差。您的错误说纬度<-90,这是不可能的。最小纬度为 -90。做这样的事情来检查坏点:
badPoints <- which(df1$lat < -90)
print(df1[badPoints,])
运行以下命令以消除缺点:
goodDf1 <- df1[(df1$lat >= -90 & df1$lat <= 90),]