当时间间隔超过特定值时拆分数据集,并为新组分配新的行程ID

时间:2016-06-23 14:02:45

标签: r

我有一个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。

非常感谢

1 个答案:

答案 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的最高值开始计数,并在每次调用时将一个加到计数中。