คำนวณระยะทางระหว่างแถวที่ติดต่อกันตามกลุ่ม [ซ้ำ]

Aug 17 2020

เช้าบ่ายเย็น

ฉันมีข้อมูลเรือดังต่อไปนี้:

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คำนวณจากระยะห่างระหว่างจุดข้อมูลแต่ละจุดภายในการจัดกลุ่ม

คำตอบ

1 Waldi Aug 17 2020 at 16:13

ลอง :

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))
davy Aug 17 2020 at 16:14

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มีความอ่อนไหวต่อลำดับของแถว ตรวจสอบให้แน่ใจว่าอยู่ในลำดับชั่วคราว