合并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
)