R 具有sf的行之间的点距离

R 具有sf的行之间的点距离,r,dplyr,sf,R,Dplyr,Sf,我有多条轨迹保存在点类型的简单功能(sf)中。我想计算后续位置(即行)之间的欧几里德距离。到目前为止,我一直使用“手动”计算距离。我想知道我是否可以使用函数sf::st_distance()来做同样的事情。下面是一个简单的例子: library(sf) library(dplyr) set.seed(1) df <- data.frame( gr = c(rep("a",5),rep("b",5)), x = rnorm(10), y = rnorm(10) ) df

我有多条轨迹保存在
类型的简单功能(
sf
)中。我想计算后续位置(即行)之间的欧几里德距离。到目前为止,我一直使用“手动”计算距离。我想知道我是否可以使用函数
sf::st_distance()
来做同样的事情。下面是一个简单的例子:

library(sf)
library(dplyr)

set.seed(1)

df <- data.frame(
  gr = c(rep("a",5),rep("b",5)),
  x  = rnorm(10),
  y = rnorm(10)
 )

df <- st_as_sf(df,coords = c("x","y"),remove = F)


df %>%
  group_by(gr) %>%
  mutate(
    dist = sqrt((lead(x)-x)^2+(lead(y)-y)^2)
  )
#> Simple feature collection with 10 features and 4 fields
#> geometry type:  POINT
#> dimension:      XY
#> bbox:           xmin: -0.8356286 ymin: -2.2147 xmax: 1.595281 ymax: 1.511781
#> epsg (SRID):    NA
#> proj4string:    NA
#> # A tibble: 10 x 5
#> # Groups:   gr [2]
#>    gr         x       y   dist                 geometry
#>    <fct>  <dbl>   <dbl>  <dbl>                  <POINT>
#>  1 a     -0.626  1.51    1.38     (-0.6264538 1.511781)
#>  2 a      0.184  0.390   1.44     (0.1836433 0.3898432)
#>  3 a     -0.836 -0.621   2.91   (-0.8356286 -0.6212406)
#>  4 a      1.60  -2.21    3.57        (1.595281 -2.2147)
#>  5 a      0.330  1.12   NA         (0.3295078 1.124931)
#>  6 b     -0.820 -0.0449  1.31  (-0.8204684 -0.04493361)
#>  7 b      0.487 -0.0162  0.992  (0.4874291 -0.01619026)
#>  8 b      0.738  0.944   0.204    (0.7383247 0.9438362)
#>  9 b      0.576  0.821   0.910    (0.5757814 0.8212212)
#> 10 b     -0.305  0.594  NA       (-0.3053884 0.5939013)
库(sf)
图书馆(dplyr)
种子(1)
df%
变异(
距离=sqrt((导线(x)-x)^2+(导线(y)-y)^2)
)
#>具有10个功能和4个字段的简单功能集合
#>几何图形类型:点
#>尺寸:XY
#>bbox:xmin:-0.8356286 ymin:-2.2147 xmax:1.595281 ymax:1.511781
#>epsg(SRID):NA
#>proj4string:NA
#>#A tible:10 x 5
#>#组:gr[2]
#>gr x y距离几何
#>                             
#>1A-0.6261.51 1.38(-0.6264538 1.511781)
#>2 a 0.184 0.390 1.44(0.1836433 0.3898432)
#>3A-0.836-0.6212.91(-0.8356286-0.6212406)
#>4 a 1.60-2.21 3.57(1.595281-2.2147)
#>5A 0.3301.12NA(0.3295078 1.124931)
#>6b-0.820-0.04491.31(-0.8204684-0.04493361)
#>7B 0.487-0.01620.992(0.4874291-0.01619026)
#>8 b 0.738 0.944 0.204(0.7383247 0.9438362)
#>9 b 0.576 0.821 0.910(0.5757814 0.8212212)
#>10 b-0.305 0.594 NA(-0.3053884 0.5939013)

我想用
sf::st_distance()
计算
dist
。我该怎么做呢?

关于
sf
首先要知道的是,几何体列(class
sfc
中的一个)作为列表列存储在数据帧中。通常对列表列执行任何操作的关键是使用
purrr::map
和friends,或者使用接受列表列作为参数的函数。在
st_distance
的情况下,它的参数可以是
sf
(一个数据帧)、
sfc
(几何列),甚至是
sfg
(一个geom行),因此不需要
map
和friends。解决方案应如下所示:

df %>%
  group_by(gr) %>%
  mutate(
    dist = st_distance(geometry)
  )
然而,这不起作用。经过调查,我们发现了两个问题。首先,
st_distance
返回距离矩阵,而不是单个值。为了解决这个问题,我们使用
st\u distance
by\u element=T
参数

接下来,我们不能只做
dist=st_distance(几何体,lead(几何体),by_element=t)
,因为
lead
只对向量列有效,而不对列表列有效

为了解决第二个问题,我们自己使用
geometry[row\u number()+1]
创建lead列

以下是完整的解决方案:

库(sf)
图书馆(dplyr)
df%>%
分组依据(gr)%>%
变异(
铅=几何体[行号()+1],
距离=st_距离(几何、引线、按元素=T),
)
#>具有10个功能和4个字段的简单功能集合
#>活动几何体列:几何体
#>几何图形类型:点
#>尺寸:XY
#>bbox:xmin:-0.8356286 ymin:-2.2147 xmax:1.595281 ymax:1.511781
#>epsg(SRID):4326
#>proj4string:+proj=longlat+datum=WGS84+no_defs
#>#tibble:10 x 6
#>#组:gr[2]
#>gr x y距离几何
#>                   
#>1A-0.6261.51 1.38点(-0.6264538 1.511781)
#>2 a 0.184 0.390 1.44点(0.1836433 0.3898432)
#>3A-0.836-0.6212.91点(-0.8356286-0.6212406)
#>4 a 1.60-2.21 3.57分(1.595281-2.2147)
#>5 a 0.330 1.12 0分(0.3295078 1.124931)
#>6 b-0.820-0.0449 1.31点(-0.8204684-0.04493361)
#>7 b 0.487-0.0162 0.992分(0.4874291-0.01619026)
#>8 b 0.738 0.944 0.204点(0.7383247 0.9438362)
#>9 b 0.576 0.821 0.910点(0.5757814 0.8212212)
#>10 b-0.305 0.594 0点(-0.3053884 0.5939013)
#> # ... 还有一个变量:lead

感谢您不仅分享了您的解决方案,还分享了您的想法。让这个答案变得无价!