2015-01-26 118 views
0

假设我们有一个输送机构,其中行表示交付如下的数据帧:逐行距离计算

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 

鉴于上面的数据集,我想用每一个到calcute每日路由的长度送货代理的公里数(假设有一个函数可以计算两个地址的距离 - 有吗?)。我的问题是双重的:

  • 我必须按照时间顺序,以遵循“从”,后者代理的真实的物理路径,“减去”前的位置,但怎么可能一个比较实际的行与R中的“前一行”?
  • 我知道代理商每晚都会离开公司总部并到达公司总部,因此我必须将HQ-first_address_of_the_day_of_each_agent和last_address_of_the_day_of_each_agent-HQ添加到代理商的日常计算中,这也意味着我可以计算出哪些是“相邻“行(再次假定与前一个/下一个时间戳比较)。

怎么会呢?

+2

您的示例数据没有任何距离信息,所以很难开始计算总距离。见用于制备[再现的示例]的建议(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。如果你分享了一些代码,那么你也会很有帮助。 'split()'和'embed()'函数可以帮助按代理分离数据并进行连续的观察。 – MrFlick 2015-01-26 19:40:19

回答

2

这里有很多方法可以做到这一点,因为经常有在R.工作时,我会用这两个包解决这个问题:

  • dplyr(功能group_by()lead()回答你的第一个问题)
  • ggmap(功能mapdist()发现使用谷歌地图)

注意位置之间的距离,取决于您的数据集有多大,这种解决方案可能无法工作,因为谷歌地图^ h作为您可以从中请求信息的次数的限制。有关更多信息,请参阅here

为了让您一开始,这里的这个解决方案可能是如何工作的一个简单的例子,虽然它不会在开始和结束位置添加,并且没有特别小心,确保你不走在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