geosphere distHaversine() & dplyr - 向量长度错误,应为 2
geosphere distHaversine() & dplyr - error wrong length for vector, should be 2
我无法解决错误:"wrong length for vector, should be 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
,因此 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
在规模上,后一种方法几乎肯定更好,因为按行操作没有利用矢量化,因此可能会变慢。
我无法解决错误:"wrong length for vector, should be 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
,因此 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
在规模上,后一种方法几乎肯定更好,因为按行操作没有利用矢量化,因此可能会变慢。