合并R中的日期范围

合并R中的日期范围,r,R,我有这个数据帧(称为信号): 我正在尝试合并/加入日期范围,以便创建类似的内容: Start Stop Sig 1 2012-03-25 2012-04-15 Go 2 2012-04-15 2012-06-24 Stop 3 2012-06-24 2012-10-14 Go 4 2012-10-14 2012-12-02 Stop 5 2012-12-12 2012-12-16 Go 有什么想法吗?我的方法是对片段进行排序,然后将具有相同值且

我有这个数据帧(称为
信号
):

我正在尝试合并/加入日期范围,以便创建类似的内容:

        Start        Stop Sig
1  2012-03-25  2012-04-15 Go
2  2012-04-15  2012-06-24 Stop
3  2012-06-24  2012-10-14 Go
4  2012-10-14  2012-12-02 Stop
5  2012-12-12  2012-12-16 Go

有什么想法吗?

我的方法是对片段进行排序,然后将具有相同值且背靠背的片段折叠起来

require(data.table)

## generating a (similar ?) data set
df <- data.frame(dates = rep(as.Date('01-01-2010','%m-%d-%Y'),20) + sample(1:100,20), 
             sig = sample(c('stop', 'go'), replace = T, ))
             
df$sig <- as.character(df$sig)                 
             
df <- df[order(df$dates),]

### creating the lag variable for date 
df$dates2 <- c(NA,df$dates[1:nrow(df)-1])


### creating the lag variable for sig

df$sig2 <- c(NA,df$sig[1:nrow(df)-1])

## creating a variable that triggers a new segment 
df$grp <- as.numeric(df$sig != df$sig2)
df$grp[1] <- 0

### the cumsum of the trigger is actually the grouping variable 

df$grp2 <- cumsum(df$grp)


## using data table 
 dt <- data.table(df)


 dt2 <- dt[,.(start = min(dates), end = max(dates), sig = sig ), 
       grp]

这个老问题到目前为止还没有得到正确的答案。以下是使用
rleid()
函数的简明
数据表
解决方案:

library(data.table)
setDT(signal)[order(Date), .(Start = first(Date)), by = .(rleid(Sig), Sig)][
  , Stop := shift(Start, type = "lead")][
    -.N, !"rleid"]
解释
setDT()。然后,使用
rleid()
Sig
的值,按照
Date
信号进行排序,并通过连续的
Sig
条纹进行聚合。将拾取每组的第一行。要确定停止日期,新的
Start
列向前移动。最后,删除最后一行和
rleid
分组变量

资料 OP的数据:

library(data.table)
signal <- fread(
  " i          Date Sig
1  2012-03-25  Go
2  2012-04-15 Stop
3  2012-04-22 Stop
4  2012-05-13 Stop
5  2012-05-20 Stop
6  2012-06-24  Go
7  2012-09-23  Go
8  2012-09-30  Go
9  2012-10-14 Stop
10 2012-12-02  Go
11 2012-12-16 Stop", drop = 1L, data.table = FALSE
)
库(data.table)

如果您使用的是
data.table
,则
rleid
可能会有所帮助,例如
signal[,rleid(Sig)]
。我不确定这是否是预期结果。很难判断,因为你是自己编的数据,而不是使用OP提供的样本数据。
library(data.table)
setDT(signal)[order(Date), .(Start = first(Date)), by = .(rleid(Sig), Sig)][
  , Stop := shift(Start, type = "lead")][
    -.N, !"rleid"]
    Sig      Start       Stop
1:   Go 2012-03-25 2012-04-15
2: Stop 2012-04-15 2012-06-24
3:   Go 2012-06-24 2012-10-14
4: Stop 2012-10-14 2012-12-02
5:   Go 2012-12-02 2012-12-16
library(data.table)
signal <- fread(
  " i          Date Sig
1  2012-03-25  Go
2  2012-04-15 Stop
3  2012-04-22 Stop
4  2012-05-13 Stop
5  2012-05-20 Stop
6  2012-06-24  Go
7  2012-09-23  Go
8  2012-09-30  Go
9  2012-10-14 Stop
10 2012-12-02  Go
11 2012-12-16 Stop", drop = 1L, data.table = FALSE
)