假设我们有一个交付机构的数据框,其中行代表交付,如下所示:
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为单位)(假设有一个函数可以计算两个地址的距离 - 是否存在?)。我的问题有两个:
但是怎么样?
答案 0 :(得分:2)
有很多方法可以做到这一点,因为在R工作时经常有这种方法。我通过使用这两个包来解决这个问题:
group_by()
和lead()
回答您的第一个问题)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