我很難理解如何在 data.table 上應用鉛 我想計算當前點和下一點之間的方位。所以基本上計算data.table中當前行和下一行之間的方位。
這是我嘗試過的:
我有路線 data.table
library(geosphere)
library(data.table)
route<-structure(list(counter = 1:6, lon = c(11.829711, 11.8336202,
11.8333238, 11.8341994, 11.8336198, 11.8337213), lat = c(48.1091400999115,
48.1153102999101, 48.1269571999072, 48.1273386999071, 48.1297995999066,
48.1309630999063)), row.names = c(NA, -6L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x55b3b7da26f0>)
接下來我為(下)行創建“lead”data.table
lead_route_dt<-route[, data.table::shift(.SD, 1, NA, "lead", TRUE), ]
并嘗試bearingRhumb
在兩個 data.tables 上應用:
apply(data.frame(route$lon,route$lat), 1, FUN = function(x) bearingRhumb(x,cbind(lead_route_dt$lon_lead_1,lead_route_dt$lat_lead_1)))
但可悲的是,結果我得到了一個錯誤:
Error in if (sum(keep) == 0) { : missing value where TRUE/FALSE needed
我究竟做錯了什么?
uj5u.com熱心網友回復:
該錯誤是由于bearingRhumb
未處理NA
:
bearingRhumb(c(NA,NA),c(11,42))
#Error in if (sum(keep) == 0) { : missing value where TRUE/FALSE needed
您需要NA
從計算中排除包含的行:
route[,`:=`(next_lon = shift(lon,1,type='lead'),next_lat = shift(lat,1,type='lead'))]
route[!(is.na(next_lon)),bearing:=bearingRhumb(cbind(lon,lat),cbind(next_lon,next_lat))]
route
counter lon lat next_lon next_lat bearing
1: 1 11.82971 48.10914 11.83362 48.11531 22.928957
2: 2 11.83362 48.11531 11.83332 48.12696 359.026720
3: 3 11.83332 48.12696 11.83420 48.12734 56.865278
4: 4 11.83420 48.12734 11.83362 48.12980 351.066053
5: 5 11.83362 48.12980 11.83372 48.13096 3.332292
6: 6 11.83372 48.13096 NA NA NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496126.html