繁体   English   中英

按组计算所有位置到第一个位置之间的距离

[英]Calculating distance between all locations to first location, by group

我有来自几个海鸟轨道的 GPS 位置,每个位置都从殖民地 x 开始。 因此,各个轨道都具有相似的第一位置。 对于每个轨道,我想计算每个 GPS 位置与(a)代表菌落 x 位置的指定位置,或(b)给定轨道的第一个 GPS 点之间的直线距离,它代表菌落的位置X。 对于 (b),我希望使用每个新轨道 ID (track_id) 的第一个位置。

我已经在 geosphere、sp、raster、adehabitatLT、move 等中寻找合适的功能,但似乎找不到我想要的东西。

我可以计算连续 GPS 点之间的距离,但这不是我需要的。

package(dplyr)
df %>%  
  group_by(ID) %>%
  mutate(lat_prev = lag(Lat,1), lon_prev = lag(Lon,1) ) %>%
  mutate(dist = distVincentyEllipsoid(matrix(c(lon_prev, lat_prev), ncol = 2), # or use distHaversine
                                      matrix(c(Lon, Lat), ncol = 2))) 

#示例数据:

df <- data.frame(Lon = c(-96.8, -96.60861, -96.86875, -96.14351, -92.82518, -90.86053, -90.14208, -84.64081, -83.7, -82, -80, -88.52732, -94.46049,-94.30, -88.60, -80.50, -81.70, -83.90, -84.60, -90.10, -90.80, -92.70, -96.10, -96.55, -96.50, -96.00),
                   Lat = c(25.38657, 25.90644, 26.57339, 27.63348, 29.03572, 28.16380, 28.21235, 26.71302, 25.12554, 24.50031, 24.89052, 30.16034, 29.34550,
                           29.34550, 30.16034, 24.89052, 24.50031, 25.12554, 26.71302, 28.21235, 28.16380, 29.03572, 27.63348, 26.57339, 25.80000, 25.30000) ,
                   ID = c(rep("ID1", 13), rep("ID2", 13))

感谢任何指针。

你非常接近。 关键是您要计算与每个轨道中第一个观测值的距离。 因此,您需要首先装饰每个轨道中的顺序(使用dplyr::row_number()很容易做到)。 然后对于距离计算,通过使用order == 1进行子集化,使参考观察始终是第一个。

library(tidyverse)
library(geosphere)

df <- data.frame(Lon = c(-96.8, -96.60861, -96.86875, -96.14351, -92.82518, -90.86053, -90.14208, -84.64081, -83.7, -82, -80, -88.52732, -94.46049,-94.30, -88.60, -80.50, -81.70, -83.90, -84.60, -90.10, -90.80, -92.70, -96.10, -96.55, -96.50, -96.00),
                 Lat = c(25.38657, 25.90644, 26.57339, 27.63348, 29.03572, 28.16380, 28.21235, 26.71302, 25.12554, 24.50031, 24.89052, 30.16034, 29.34550, 29.34550, 30.16034, 24.89052, 24.50031, 25.12554, 26.71302, 28.21235, 28.16380, 29.03572, 27.63348, 26.57339, 25.80000, 25.30000),
                 ID = c(rep("ID1", 13), rep("ID2", 13)))
                 
                 
df %>%  
  group_by(ID) %>%
  mutate(order = row_number()) %>% 
  mutate(dist = distVincentyEllipsoid(matrix(c(Lon[order == 1], Lat[order == 1]), ncol = 2), 
                                      matrix(c(Lon, Lat), ncol = 2)))
#> # A tibble: 26 x 5
#> # Groups:   ID [2]
#>      Lon   Lat ID    order     dist
#>    <dbl> <dbl> <chr> <int>    <dbl>
#>  1 -96.8  25.4 ID1       1       0 
#>  2 -96.6  25.9 ID1       2   60714.
#>  3 -96.9  26.6 ID1       3  131665.
#>  4 -96.1  27.6 ID1       4  257404.
#>  5 -92.8  29.0 ID1       5  564320.
#>  6 -90.9  28.2 ID1       6  665898.
#>  7 -90.1  28.2 ID1       7  732131.
#>  8 -84.6  26.7 ID1       8 1225193.
#>  9 -83.7  25.1 ID1       9 1319482.
#> 10 -82    24.5 ID1      10 1497199.
#> # ... with 16 more rows

代表 package (v2.0.1) 于 2022 年 1 月 9 日创建

这似乎也有效(由朋友发送给我) - 与上面 Dan 的建议非常相似,但略有不同

library(geosphere)
library(dplyr)

df %>% 
  group_by(ID) %>%
  mutate(Dist_to_col = distHaversine(c(Lon[1], Lat[1]),cbind(Lon,Lat)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM