Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按行程在R中分组数据_R_Timestamp - Fatal编程技术网

按行程在R中分组数据

按行程在R中分组数据,r,timestamp,R,Timestamp,我有以下格式的数据: DeviceId VIN Latitude Longitude TrueTime 1 S5353532523 XY1 37.51874 -87.47483 2016-06-05 18:46:00 2 S5353532523 XY1 37.52975 -87.47588 2016-06-05 18:46:00 3 S5353532523 X

我有以下格式的数据:

   DeviceId               VIN Latitude Longitude            TrueTime
1 S5353532523              XY1  37.51874 -87.47483 2016-06-05 18:46:00
2 S5353532523              XY1  37.52975 -87.47588 2016-06-05 18:46:00
3 S5353532523              XY1  37.53472 -87.47734 2016-06-05 18:47:00
4 S5353532523              XY1  37.53769 -87.47846 2016-06-05 18:47:00
5 S5353532523              XY1  37.54271 -87.47963 2016-06-05 18:47:00
6 S5353532523              XY1  37.54780 -87.47942 2016-06-05 18:47:00
...
我想将这些数据分组到trips中。使用dplyr我从以下内容开始:

 Data %>% group_by(VIN, DeviceID) %>% ?
然而,我很好奇我应该在问号里写些什么。基本上,我想添加一列,在上一个时间增量大于5分钟后,从1开始分配tripID


因此,在某个时刻,当TrueTime变化超过5分钟时,tripCounter将上升1。此外,它还需要在VIN和DeviceID上递增(因此计数器不应在每组开始时重置为1)

我们可以使用
difftime
获取各组相邻元素之间的差异,将
单位指定为
“分钟”
,创建逻辑索引,
cumsum
创建“TripID”

Data %>% 
      group_by(VIN, DeviceId) %>% 
      mutate(TripID = cumsum(c(TRUE, difftime(TrueTime[-1], 
                             TrueTime[-n()], units = "mins")>5)))
不清楚复位部分。如果这是基于跨组大于5分钟的“TrueTime”,我们不需要
group\u by

Data %>%
       mutate(TripID = cumsum(c(TRUE, difftime(TrueTime[-1], 
                     TrueTime[-nrow(Data)], units = "mins")>5)))
Data %>% 
     group_by(VIN, DeviceId) %>%
     mutate(TripID = cumsum(c(TRUE, difftime(TrueTime[-1], 
              TrueTime[-n()], units = "mins")>5))) %>%
     ungroup() %>% 
     mutate(TripID = group_indices_(., .dots = c("VIN", "DeviceId"))-1 + TripID)
或者如果在执行
group\u by

Data %>%
       mutate(TripID = cumsum(c(TRUE, difftime(TrueTime[-1], 
                     TrueTime[-nrow(Data)], units = "mins")>5)))
Data %>% 
     group_by(VIN, DeviceId) %>%
     mutate(TripID = cumsum(c(TRUE, difftime(TrueTime[-1], 
              TrueTime[-n()], units = "mins")>5))) %>%
     ungroup() %>% 
     mutate(TripID = group_indices_(., .dots = c("VIN", "DeviceId"))-1 + TripID)
注:“TrueTime”类假定为
POSIXct

数据
数据请查看您是否能提供帮助:我得到一个“TrueTime”有一个不受支持的类型:POSIXlt,POSIXt?不确定为什么我使用“as.Posixlt”@user1357015转换了它,
dplyr
mutate只支持
POSIXct
,请使用
as.POSIXct
@akrun:这是固定的,但现在我得到:
错误:不兼容的大小(990),期望989(组大小)或1另外:警告消息:在unclass(time1)-unclass(time2):较长的对象长度不是较短对象长度的倍数
我添加了一个过滤器(n()>1),以确保每个组至少有两个entries@Akrun啊,我明白了,你需要组内的计数。不是整个数据帧。:-)谢谢你的帮助!