R 快速、正确的距离计算

R 快速、正确的距离计算,r,dplyr,geosphere,R,Dplyr,Geosphere,我有一个大的数据框(>800万行),包含对个人和不同站点的观察。我感兴趣的是这些地点与几个关键地点的距离(2014年1个地点,2015年2个地点) 为了减少计算次数(并加快计算速度),我使用dplyr将所有已知位置折叠为每年一个具有代表性的站点,然后尝试使用distGeo函数计算年份匹配时的距离 dist <- df %>% mutate(year = year(ts)) %>% #ts is the time stamp for each observation s

我有一个大的数据框(>800万行),包含对个人和不同站点的观察。我感兴趣的是这些地点与几个关键地点的距离(2014年1个地点,2015年2个地点)

为了减少计算次数(并加快计算速度),我使用dplyr将所有已知位置折叠为每年一个具有代表性的站点,然后尝试使用distGeo函数计算年份匹配时的距离

dist <- df %>% 
  mutate(year = year(ts)) %>% #ts is the time stamp for each observation
  select(site, lat, lon, year) %>% 
  group_by(site, lat, lon, year) %>% 
  summarise(n=n()) %>% #if I stop after summarise, the data frame has been reduced to 93 observations
  mutate(dist1 = ifelse(year == "2014",
                        distGeo(c(-64.343043, 45.897932), #coordinates for key location in 2014
                                df[,c("lon", "lat")])/1000, 
                         NA_real_)) #I have a similar lines for the two key locations in 2015
dist%
mutate(year=year(ts))%>%#ts是每次观察的时间戳
选择(地点、纬度、经度、年份)%>%
分组依据(地点、纬度、经度、年份)%>%
总结(n=n())%>%#如果我在总结后停止,则数据帧已减少到93个观察值
变异(dist1=ifelse(年份==“2014”,
distGeo(c(-64.343043,45.897932),#2014年关键位置坐标
df[,c(“lon”,“lat”))/1000,
NA_real##2015年,我在这两个关键地点有一条类似的线路
仅运行此部分需要约30分钟,结果是每个2014站点的距离为740.1656公里。如何修复此代码以提供正确的距离,并在理想情况下加速计算

编辑:

如下所示,解决方案如下:

dist <- df %>% 
  mutate(year = year(ts)) %>%
  select(site, lat, lon, year) %>% 
  group_by(site, lat, lon, year) %>% 
  summarise(n=n()) %>% 
  mutate(dist1 = ifelse(year == "2014",
                     pmap_dbl(list(lon, lat),
                              ~distVincentyEllipsoid(c(-64.343043, 45.897932), 
                                                     c(.x, .y))/1000), 
                     NA_real_)
dist%
突变(年=年(ts))%>%
选择(地点、纬度、经度、年份)%>%
分组依据(地点、纬度、经度、年份)%>%
总结(n=n())%>%
变异(dist1=ifelse(年份==“2014”,
pmap_dbl(列表(长、宽),
~distVincentyEllipsoid(c(-64.343043,45.897932),
c(.x,.y))/1000),
纳乌(雷亚尔)

您可以使用
purr::pmap
快速执行此操作(因为
distGeo
没有矢量化)

library(tidyverse)#用于dplyr和purrr
图书馆(地球圈)#用于distGeo

df谢谢@Andrew Gustar。你能更详细地解释一下什么是distGeo没有矢量化吗?我过去也做过类似的事情,但没有同样的问题。@tnt
distGeo
的前两个参数是2向量(lon,lat)(或者,我认为,n*2矩阵),因此,您不能简单地用向量替换它们,并期望函数生成向量输出,就像使用许多R函数一样。相反,您需要类似于
pmap
mappy
的内容来同时迭代两个lat和lon向量。
library(tidyverse) #for dplyr and purrr
library(geosphere) #for distGeo

df <- data.frame(lat = 90*runif(100), lon = 90*runif(100)) #dummy data

dist <- df %>% 
  mutate(dist1 = pmap_dbl(list(lon, lat),     #pmap_dbl ensures output is vector of numbers
                          ~distGeo(c(-64.343043, 45.897932), 
                                   c(.x, .y)) / 1000))