คำนวณระยะทางระหว่างแถวที่ติดต่อกันตามกลุ่ม [ซ้ำ]
เช้าบ่ายเย็น
ฉันมีข้อมูลเรือดังต่อไปนี้:
set.seed(123)
df <- data.frame(
fac = as.factor(c("A", "A", "A", "A",
"B", "B", "B",
"C", "C", "C", "C", "C")),
lat = runif(12, min = 45, max = 47),
lon = runif(12, min = -6, max = -5 ))
fac
กลุ่มที่ข้อมูลจากตัวแปรปัจจัยที่
library(dplyr)
df_grouped <- df %>%
group_by(fac) %>%
summarise(first_lon = first(lon),
last_lon = last(lon),
first_lat = first(lat),
last_lat = last(lat))
ฉันใช้ละติจูดแรกและสุดท้าย ( lat
) และลองจิจูด ( lon
) เพื่อสร้างรูปหลายเหลี่ยม
ฉันยังใช้ละติจูดแรกและสุดท้าย ( lat
) และลองจิจูด ( lon
) เพื่อประมาณระยะทางข้ามรูปหลายเหลี่ยม
library(geosphere)
df_grouped %>%
mutate(distance_m = distHaversine(matrix(c(first_lon, first_lat), ncol = 2),
matrix(c(last_lon, last_lat), ncol = 2)))
แม้ว่าสิ่งนี้จะถือว่าเรือเดินเป็นเส้นตรงในระยะทางที่ยาวที่สุดที่เป็นไปได้ภายในรูปหลายเหลี่ยม
สิ่งนี้ไม่เป็นความจริงเสมอไปบางครั้งมันก็กระดิกเล็กน้อย:
สิ่งที่ฉันอยากจะทำคือระยะทางจริงที่เรือเดินทางโดยคำนวณระยะห่างระหว่างแต่ละแถวกับกลุ่ม
หรือกล่าวอีกนัยหนึ่ง:
ตัวอย่างเช่นfac == "C"
เรือจะมีx
เมตรเดินทางซึ่งx
คำนวณจากระยะห่างระหว่างจุดข้อมูลแต่ละจุดภายในการจัดกลุ่ม
คำตอบ
ลอง :
df %>% group_by(fac) %>%
mutate(lat_prev = lag(lat,1), lon_prev = lag(lon,1) ) %>%
mutate(dist = distHaversine(matrix(c(lon_prev, lat_prev), ncol = 2),
matrix(c(lon, lat), ncol = 2))) %>%
summarize(dist = sum(dist,na.rm=T))
# A tibble: 3 x 2
fac dist
<fct> <dbl>
1 A 93708.
2 B 219742.
3 C 347578.
ดีกว่ามากตามคำแนะนำของ Henrik:
df %>% group_by(fac) %>%
summarize(dist = distHaversine(cbind(lon, lat))) %>%
summarize(dist = sum(dist,na.rm=T))
dplyr::lag
จะดึงค่าจากแถวก่อนหน้านี้ จากนั้นคุณสามารถส่งผ่านค่าเหล่านั้นไปยังขั้นตอนการกลายพันธุ์ที่สองเพื่อทำการคำนวณระยะทาง (สิ่งเหล่านี้อาจไม่ใช่การคำนวณเฉพาะที่คุณต้องการ แต่แสดงให้เห็นถึงเทคนิคทั่วไป):
library(dplyr)
df %>%
group_by(fac) %>%
mutate(lag_lat = lag(lat), lag_lon = lag(lon)) %>%
mutate(dist_lat = lat - lag_lat, dist_lon = lon - lag_lon)
โปรดทราบว่าlag
มีความอ่อนไหวต่อลำดับของแถว ตรวจสอบให้แน่ใจว่าอยู่ในลำดับชั่วคราว