在R中,使用dplyr函数查找最小距离

在R中,使用dplyr函数查找最小距离,r,dplyr,R,Dplyr,我有一个带有两个数字变量的数据帧:lat和long。像这样的 > head(pontos_sub) id lat long 1 0 -22,91223 -43,18810 2 1 -22,91219 -43,18804 3 2 -22,91225 -43,18816 4 3 -22,89973 -43,20855 5 4 -22,89970 -43,20860 6 5 -22,89980 -43,20860 现在,我将做一个整数: pontos_su

我有一个带有两个数字变量的数据帧:
lat
long
。像这样的

> head(pontos_sub)
  id       lat      long
1  0 -22,91223 -43,18810
2  1 -22,91219 -43,18804
3  2 -22,91225 -43,18816
4  3 -22,89973 -43,20855
5  4 -22,89970 -43,20860
6  5 -22,89980 -43,20860
现在,我将做一个整数:

pontos_sub$long_r <- round(pontos_sub$long, 3)
pontos_sub$lat_r <- round(pontos_sub$lat, 3)

> head(pontos_sub)
  id       lat      long  long_r   lat_r
1  0 -22,91223 -43,18810 -43,188 -22,912 
2  1 -22,91219 -43,18804 -43,188 -22,912
3  2 -22,91225 -43,18816 -43,188 -22,912
4  3 -22,89973 -43,20855 -43,209 -22,900 
5  4 -22,89970 -43,20860 -43,209 -22,900
6  5 -22,89980 -43,20860 -43,209 -22,900

最后,这是最快的方式吗?还是有其他更快的方法?T

您可以这样做:

pontos_sub %>% 
  mutate(dist = distVincentyEllipsoid(cbind(long, lat), cbind(long_r, lat_r))) %>% 
  group_by(long_r, lat_r) %>% 
  arrange(dist) %>% 
  slice(1) %>% 
  rename(min_long = long, min_lat = lat) %>% 
  select(long_r, lat_r, min_long, min_lat)

# Source: local data frame [2 x 4]
# Groups: long_r, lat_r [2]
# 
#    long_r   lat_r  min_long   min_lat
#     <dbl>   <dbl>     <dbl>     <dbl>
# 1 -43.209 -22.900 -43.20860 -22.89980
# 2 -43.188 -22.912 -43.18804 -22.91219
pontos_sub%>%
变异(dist=distVincentyEllipsoid(cbind(long,lat),cbind(long_r,lat_r)))%>%
分组依据(长、宽)%>%
排列(距离)%%>%
切片(1)%>%
重命名(min_long=long,min_lat=lat)%>%
选择(长、宽、最小长、最小宽)
#来源:本地数据帧[2 x 4]
#组别:长![2]
# 
#长时间
#                  
# 1 -43.209 -22.900 -43.20860 -22.89980
# 2 -43.188 -22.912 -43.18804 -22.91219
数据:

pontos_sub <- read.table(text="
  id       lat      long
1  0 -22,91223 -43,18810
2  1 -22,91219 -43,18804
3  2 -22,91225 -43,18816
4  3 -22,89973 -43,20855
5  4 -22,89970 -43,20860
6  5 -22,89980 -43,20860                
                ", dec = ",")

pontos_sub$long_r <- round(pontos_sub$long, 3)
pontos_sub$lat_r <- round(pontos_sub$lat, 3)
pontos_sub
pontos_sub %>% 
  mutate(dist = distVincentyEllipsoid(cbind(long, lat), cbind(long_r, lat_r))) %>% 
  group_by(long_r, lat_r) %>% 
  arrange(dist) %>% 
  slice(1) %>% 
  rename(min_long = long, min_lat = lat) %>% 
  select(long_r, lat_r, min_long, min_lat)

# Source: local data frame [2 x 4]
# Groups: long_r, lat_r [2]
# 
#    long_r   lat_r  min_long   min_lat
#     <dbl>   <dbl>     <dbl>     <dbl>
# 1 -43.209 -22.900 -43.20860 -22.89980
# 2 -43.188 -22.912 -43.18804 -22.91219
pontos_sub <- read.table(text="
  id       lat      long
1  0 -22,91223 -43,18810
2  1 -22,91219 -43,18804
3  2 -22,91225 -43,18816
4  3 -22,89973 -43,20855
5  4 -22,89970 -43,20860
6  5 -22,89980 -43,20860                
                ", dec = ",")

pontos_sub$long_r <- round(pontos_sub$long, 3)
pontos_sub$lat_r <- round(pontos_sub$lat, 3)