快速、正确的距离计算
quick, correct distance calculations
我有一个大型数据框(> 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 公里。我如何修复此代码以提供正确的距离,并在理想情况下加快计算速度?
编辑:
按照下面的建议,这是解决方案:
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))
您需要修改它以包括我忽略的年份和其他变量。
您的代码的问题是在以 df
开头的 dplyr
管道中使用了 df[...]
项。最好只使用上面的裸变量名。
我有一个大型数据框(> 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 公里。我如何修复此代码以提供正确的距离,并在理想情况下加快计算速度?
编辑:
按照下面的建议,这是解决方案:
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))
您需要修改它以包括我忽略的年份和其他变量。
您的代码的问题是在以 df
开头的 dplyr
管道中使用了 df[...]
项。最好只使用上面的裸变量名。