我有一个GPS位置的数据集,其中包含相应的旅行ID,日期和时间,以及每次旅行中连续点之间的分钟数的时间间隔:
> example
TripID DATIM INTV
1 522 22/05/2010 11:05 120
2 522 22/05/2010 13:05 120
3 522 22/05/2010 15:05 120
4 522 22/05/2010 17:05 120
5 522 22/05/2010 19:05 120
6 522 22/05/2010 21:05 120
7 10 28/05/2010 11:05 120
8 10 28/05/2010 13:05 120
9 10 29/05/2010 09:05 1200
10 10 29/05/2010 11:05 120
11 10 29/05/2010 13:05 120
12 10 29/05/2010 15:05 120
13 10 29/05/2010 17:05 120
14 657 04/06/2010 11:05 120
15 657 04/06/2010 13:05 120
16 657 04/06/2010 15:05 120
我希望在时间间隔超过240分钟时将行程中的数据拆分,并为新组分配新的TripID。在我的例子中,我想为行9到13分配一个新的行程ID,因为第8行和第9行之间的时间间隔超过240分钟,以获得以下数据集:
TripID DATIM INTV
1 522 22/05/2010 11:05 120
2 522 22/05/2010 13:05 120
3 522 22/05/2010 15:05 120
4 522 22/05/2010 17:05 120
5 522 22/05/2010 19:05 120
6 522 22/05/2010 21:05 120
7 10 28/05/2010 11:05 120
8 10 28/05/2010 13:05 120
9 333 29/05/2010 09:05 1200
10 333 29/05/2010 11:05 120
11 333 29/05/2010 13:05 120
12 333 29/05/2010 15:05 120
13 333 29/05/2010 17:05 120
14 657 04/06/2010 11:05 120
15 657 04/06/2010 13:05 120
16 657 04/06/2010 15:05 120
以下是我开始编写的代码:
TripIDs<-unique(example$TripID)
for (i in length(TripIDs)){
Trip<-example[which(example$TripID == TripIDs[i]),] #split by trip
breaks<-Trip$INTV[Trip$INTV>=1200] #define the breaks
groups<-cut(Trip$INTV,breaks = breaks) #cut the trip at defined breaks
ddply(Trip,"groups",**function()**) # assign a new name to each group of the trip
}
我的问题是使用ddply函数,该函数需要一个函数为行程的每个新组分配唯一的名称。我不确定ddply功能在这里是否合适,并且想知道是否有人知道如何在时间间隔超过240分钟的情况下拆分行程中的数据并为每个新创建的组分配唯一的行程ID。
非常感谢
答案 0 :(得分:0)
我认为很多问题涉及[1]使用布尔测试和下标以及[2] split-apply-combine来映射某些条件。我认为在使用像plyr::ddply
之类的干净抽象之前自己拆分,应用和组合它是有意义的,以建立直觉并在细粒度级别上解决问题。
fix_id <- function(df) {
if (any(df$INTV > 240)) df$TripID <- 999999
# Assuming if ANY INTV in the group is > 240, make a new id for the group.
# 999999 is an example id; you'll have to find a meaningful way to set ids.
return(df)
}
splitted <- split(example, example$TripID)
applied <- lapply(splitted, fix_id)
combined <- plyr::rbind.fill(applied)
如果按预期工作,那么我可能会这样做:
plyr::ddply(df, 'TripID', fix_id)
我没有解决如何有意义地分配新的TripID,因为我不认为我对这个问题非常熟悉。但是一个选项是使用函数运算符来维持fix_id
的不同调用的状态;所以它开始以TripID的最高值开始计数,并在每次调用时将一个加到计数中。