快速正确的距离计算

时间:2019-01-25 16:58:52

标签: r dplyr geosphere

我有一个大的数据框(> 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分钟,因此每个2014年站点的距离为740.1656 km。如何修复此代码以提供正确的距离,并在理想情况下加快计算速度?

编辑:

如下所示,这是解决方法:

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

1 个答案:

答案 0 :(得分:1)

您可以使用==相当快地完成此操作(因为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)) 开头的df[...]管道中使用dplyr术语。最好只使用上面的裸变量名称。