逐行距离计算

时间:2015-01-26 18:40:03

标签: r

假设我们有一个交付机构的数据框,其中行代表交付,如下所示:

Agent   Time of Delivery    Address
Alpha   12-30-2012 08:12    Location 1
Alpha   12-30-2012 08:18    Location 2
Alpha   12-30-2012 10:12    Location 3
Alpha   12-30-2012 10:25    Location 4
Beta    12-30-2012 08:30    Location 2
Beta    12-30-2012 09:44    Location 5
Beta    12-30-2012 18:11    Location 1
Gamma   12-30-2012 07:05    Location 6
Gamma   12-30-2012 08:30    Location 4
Gamma   12-30-2012 08:33    Location 3
Gamma   12-30-2012 14:12    Location 1
Gamma   12-30-2012 22:05    Location 2

鉴于上面的数据集,我想计算每个交付代理的每日路线长度(以km为单位)(假设有一个函数可以计算两个地址的距离 - 是否存在?)。我的问题有两个:

  • 我必须遵循时间顺序,以便遵循代理的真实物理路线,并且"减去"以前的位置"来自"后者,但如何将实际行与"之前的" R?
  • 中的一行
  • 知道代理人每天早上离开并且每天晚上到达公司总部,我必须将HQ-first_address_of_the_day_of_each_agent和last_address_of_the_day_of_each_agent-HQ添加到代理商的日常计算中,这也意味着我可以找出哪些是& #34;相邻"行(再次与前一个/下一个时间戳的假设比较)。

但是怎么样?

1 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点,因为在R工作时经常有这种方法。我通过使用这两个包来解决这个问题:

  • dplyr(函数group_by()lead()回答您的第一个问题)
  • ggmap(函数mapdist()使用Google地图查找位置之间的距离)

请注意,根据数据集的大小,此解决方案可能无效,因为Google地图对您可以向其请求信息的次数有限制。有关详细信息,请参阅here

为了帮助您入门,以下是此解决方案如何运作的快速示例,尽管它不会添加到开始和结束位置,并且在确保您不要使用时并不特别小心#39;超过API限制。

对于第二个问题,它取决于数据集的结构。单个数据集中有多天?您可以创建一个虚拟数据集,其中包含每个人的姓名和每个可用日期,以使用rbind()添加到主数据集,然后将数据集arrange()添加到正确的顺序。

library(dplyr)
library(ggmap)

distance_helper <- function(x, y) {
    Sys.sleep(0.1) # To avoid running out of requests

    out <- mapdist(x, y)
    return(out$km)
}

data <- data.frame(agent = c("a", "a", "a", "b", "b", "b"), 
                   address = c("Atlanta", "Detroit", "Chicago", "San Francisco", "Des Moines", "Austin"), stringsAsFactors=F)

out <- data %>% 
            group_by(agent) %>%
            mutate(distance = distance_helper(address, lead(address)))

out