geosphere distHaversine() & dplyr - 错误向量长度错误,应该是 2

Posted

技术标签:

【中文标题】geosphere distHaversine() & dplyr - 错误向量长度错误,应该是 2【英文标题】:geosphere distHaversine() & dplyr - error wrong length for vector, should be 2 【发布时间】:2016-11-11 19:06:53 【问题描述】:

在尝试计算两点(跑道入口/终点)之间的(跑道长度)距离时,我无法解决错误:“向量长度错误,应为 2”。 更糟糕的是,我无法理解像R error: Wrong length for a vector, should be 2 这样的答案并将它们应用于我的案例。 (跑道末端)位置的简化数据框如下所示:

runways <-  data.frame(
 RWY_ID = c(1,2,3)
,RWY    = c("36R", "36L","01")
,LAT    = c(40.08, 40.12, 40.06)
,LON    = c(116.59, 116.57, 116.62)
,LAT2   = c(40.05, 40.07,40.09)
,LON2   = c(116.6, 116.57, 116.61)
)

使用 geosphere 中的 distHaversine() 函数,我尝试计算距离:

runways <- mutate(runways
                 , CTD = distHaversine( c(LON, LAT), c(LON2, LAT2))
                 )

我不确定我在这里做错了什么。如果我拉出 LON LAT 位置,它是一个长度正确的数值向量。

myv <- c(runways$LON[1], runways$LAT[1])
myv

[1] 116.59  40.08
str(myv)
num [1:2] 116.6 40.1

【问题讨论】:

你需要操作rowwise,或者它一次通过所有行:runways %&gt;% rowwise() %&gt;% mutate(CTD = geosphere::distHaversine( c(LON, LAT), c(LON2, LAT2))) 谢谢!!! Alistaire ... 生活可以如此轻松。我假设错误消息然后指向这样一个事实,即矢量化方法的排序超过了所需的长度 2。 【参考方案1】:

您需要操作rowwise,因此distHaversine 一次传递一组对而不是所有行:

runways %>% rowwise() %>% 
    mutate(CTD = distHaversine(c(LON, LAT), c(LON2, LAT2)))

## Source: local data frame [3 x 7]
## Groups: <by row>
## 
## # A tibble: 3 × 7
##   RWY_ID    RWY   LAT    LON  LAT2   LON2      CTD
##    <dbl> <fctr> <dbl>  <dbl> <dbl>  <dbl>    <dbl>
## 1      1    36R 40.08 116.59 40.05 116.60 3446.540
## 2      2    36L 40.12 116.57 40.07 116.57 5565.975
## 3      3     01 40.06 116.62 40.09 116.61 3446.509

另外,distHaversine 可以处理矩阵,因此您可以使用cbind 代替c

runways %>% mutate(CTD = distHaversine(cbind(LON, LAT), cbind(LON2, LAT2)))

##   RWY_ID RWY   LAT    LON  LAT2   LON2      CTD
## 1      1 36R 40.08 116.59 40.05 116.60 3446.540
## 2      2 36L 40.12 116.57 40.07 116.57 5565.975
## 3      3  01 40.06 116.62 40.09 116.61 3446.509

在规模上,后一种方法几乎肯定更好,因为按行操作没有利用矢量化,因此会变慢。

【讨论】:

谢谢,Alistaire,我欠你一杯啤酒。现在看到解决方案,我觉得有点谦虚。通过 cbind() 移动到矩阵感觉比逐行迭代更优雅。我还有很多事情要学习 R ... :) 别担心,这是个好问题。当您在 dplyr 中引用列名时,考虑您传递给函数的内容是其中一项恒定且并非立即透明的任务,以避免因挑剔的函数出现错误。 如何将此输出的一列永久添加到原始数据集中?添加 runways$CTD –>... 并删除 CTD=... 我最终在原始数据集中得到一个矩阵...仅离开 CTD 它只能在运行上面的代码行时看到... 这是我在添加 runways$CTD –>... 并删除 CTD=... 时得到的类型

以上是关于geosphere distHaversine() & dplyr - 错误向量长度错误,应该是 2的主要内容,如果未能解决你的问题,请参考以下文章

优化 R 中大 df 的距离 distHaversine 模型

求和列基于 r 中 distHaversine 的 long/lat 的半径

R 错误:向量的长度错误,使用 Geosphere 包时应为 2

使用 R 质心函数问题计算蒙大拿州的中心

如何通过distHarvesine()有效地使用经度和纬度数据?

计算数据框中两个长纬度坐标之间的距离