【发布时间】:2019-12-18 22:01:51
【问题描述】:
我是 R 语言的普通用户,我有一个包含 800000 个加拿大邮政编码坐标(经度、纬度)的数据集。
我附上了一个 CSV 文件,其中包含一个名为 question.csv 的示例。
TariffZone<-c("CAAL1","CAAL2","CAAL3","CAAL3")
latitude<-c(51.15701,51.91826,50.80972,50.76358)
longitude<-c(-110.206392,-110.146722,-110.7003,-110.568045)
elevation<-c(300,400,450,450)
d<-data.frame(TariffZone,latitude,longitude,elevation)
我正在尝试获取一个表格,其中包含关税区之间的所有公里距离(平均每个邮政编码的坐标)
我看过一个相关的问题:R distance matrix build
不幸的是,我无法用给定的答案解决我的问题,这是我的代码:
d<-read.csv("question.csv", header=TRUE)
head(d)
d2<-d %>%
group_by(TariffZone) %>%
summarise(latitude_mean=mean(latitude),longitude_mean=mean(longitude),elevation_mean=mean(elevation)) %>%
dplyr::mutate_if(is.numeric, format, 4) %>%
ungroup()
head(d2)
d3<-data.frame(d2$longitude_mean,d2$latitude_mean)
head(d3)
distable<-dist(cbind(d2$longitude_mean,d2$latitude_mean),cbind(d2$longitude_mean,d2$latitude_mean),method=euclidean)
harvesine<-function(lat1,lat2){
newVar<-acos(sin(lat1*3.14159265359/180)*sin(lat2*3.14159265359/180) + cos(lat1*3.14159265359/180)*cos(lat2*3.14159265359/180)*cos(lon2*3.14159265359/180-lon1*3.14159265359/180) ) * 6371000}
如果我忘记添加任何信息或者我必须准确提出我的问题,请不要犹豫。
奖励:如果有办法可以使用代码中的 harvesine 公式而不是欧几里得公式,并且可以将此表导出回 csv 文件
【问题讨论】:
-
如果您使用
geosphere::distm而不是dist,默认情况下它将使用非常有效的Haversine 距离近似值,或者您可以指定Haversine 距离。 -
如果您需要更多帮助,请分享一些示例数据,例如 dput(head(d3))`,这样我们就可以看到您的代码实际输出的内容并有一些东西可以测试新的解决方案。
-
感谢 Gregor 的快速 cmets,我已经编辑了我的帖子,今天我将研究这些替代问题。
-
所以我尝试了 matrix