r语言 - 快速、正确的距离计算



我有一个大型数据帧(>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

仅运行此部分就需要 ~30 分钟,结果是每个 740.1656 站点的距离为 2014 公里。 如何修复此代码以提供正确的距离,并在理想情况下加快计算速度?

编辑:

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

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_)
您可以使用

purrr::pmap非常快速地执行此操作(因为distGeo没有矢量化)...

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))

您需要修改此设置以包含我忽略的年份和其他变量。

代码的问题在于dplyr管道中使用了以 df 开头的df[...]术语。 最好只使用上面的裸变量名称。

相关内容

  • 没有找到相关文章

最新更新