R 要启动和停止的事件数据
我有一个带有日期时间和值的数据框,如下所示:R 要启动和停止的事件数据,r,time-series,R,Time Series,我有一个带有日期时间和值的数据框,如下所示: datetime value 1 2016-05-03 08:51:41 0 2 2016-05-03 10:36:24 0 3 2016-05-03 10:36:32 9 4 2016-05-03 10:45:01 5 5 2016-05-03 10:45:24 0 6 2016-05-03 19:37:02 0 7 2016-05-03 19:37:06 7 8 2
datetime value
1 2016-05-03 08:51:41 0
2 2016-05-03 10:36:24 0
3 2016-05-03 10:36:32 9
4 2016-05-03 10:45:01 5
5 2016-05-03 10:45:24 0
6 2016-05-03 19:37:02 0
7 2016-05-03 19:37:06 7
8 2016-05-03 19:48:38 0
我想要的是一个表,其中包含值为常量的时段的开始和停止时间。对于上表,预期输出如下:
value start stop
1 0 <NA> 2016-05-03 10:36:32
2 9 2016-05-03 10:36:32 2016-05-03 10:45:01
3 5 2016-05-03 10:45:01 2016-05-03 10:45:24
4 0 2016-05-03 10:45:24 2016-05-03 19:37:06
5 7 2016-05-03 19:37:06 2016-05-03 19:48:38
6 0 2016-05-03 19:48:38 <NA>
假设您的第一个数据帧名为
x
。然后做:
data.frame(value=names(tapply(x$datetime,x$value,min)),start=tapply(x$datetime,x$value,max),stop=tapply(x$datetime,x$value,max))
假设您的第一个数据帧被命名为x
。然后做:
data.frame(value=names(tapply(x$datetime,x$value,min)),start=tapply(x$datetime,x$value,max),stop=tapply(x$datetime,x$value,max))
使用数据。表格
library(data.table)
setDT(DF)
res = DF[, .(end = datetime[.N]), by=.(value, seq = rleid(value))]
res[.N, end := NA]
value seq end
1: 0 1 2016-05-03 04:36:24
2: 9 2 2016-05-03 04:36:32
3: 5 3 2016-05-03 04:45:01
4: 0 4 2016-05-03 13:37:02
5: 7 5 2016-05-03 13:37:06
6: 0 6 <NA>
工作原理:
过滤到DT[i,j,by]
,然后在i
确定的每个子集中计算by
j
只是()
列表()的快捷方式
标识每个相同值的“运行”rleid
是.N
组中的行数(如果by
为空,则为表中的行数)by
通过引用修改列:=
是滞后/超前运算符shift
按引用重新排列列setcolorder
dput
,或者是因为POSIX datetime对象非常挑剔。我建议改为使用data.table包中的IDateTime
)使用data.table
library(data.table)
setDT(DF)
res = DF[, .(end = datetime[.N]), by=.(value, seq = rleid(value))]
res[.N, end := NA]
value seq end
1: 0 1 2016-05-03 04:36:24
2: 9 2 2016-05-03 04:36:32
3: 5 3 2016-05-03 04:45:01
4: 0 4 2016-05-03 13:37:02
5: 7 5 2016-05-03 13:37:06
6: 0 6 <NA>
工作原理:
过滤到DT[i,j,by]
,然后在i
确定的每个子集中计算by
j
只是()
列表()的快捷方式
标识每个相同值的“运行”rleid
是.N
组中的行数(如果by
为空,则为表中的行数)by
通过引用修改列:=
是滞后/超前运算符shift
按引用重新排列列setcolorder
(请注意,我的结果看起来不像OP的结果,可能是因为给出了错误的
dput
,也可能是因为POSIX datetime对象非常挑剔。我建议改为从data.table包中读取IDateTime
)当我读入数据时,我会看到非常不同的时间(以6小时和不同的秒为间隔)。我猜这是恼人的datetime格式的一些副作用…当我在中读取数据时,我看到的时间非常不同(减少了6小时和不同的秒数)。我猜这是恼人的datetime格式的一些副作用…不,在值==0处花费的每个法术都应该有一个额外的行。对,很抱歉,我最初错过了。不,在值==0处花费的每个法术都应该有一个额外的行。对,很抱歉,我最初错过了。假设我想通过另一个变量进行分组。“我该怎么做呢?”“皇室成员们,我不知道我是否明白你的要求。您可以通过=.(…)将更改为其他内容。如果这还不够,也许你需要发布一个新问题。假设我想用另一个变量分组。“我该怎么做呢?”“皇室成员们,我不知道我是否明白你的要求。您可以通过=.(…)
将更改为其他内容。如果这还不够,也许你需要发布一个新问题。
res[, start := shift(end)]
setcolorder(res, c("value", "seq", "start", "end"))
value seq start end
1: 0 1 <NA> 2016-05-03 04:36:24
2: 9 2 2016-05-03 04:36:24 2016-05-03 04:36:32
3: 5 3 2016-05-03 04:36:32 2016-05-03 04:45:01
4: 0 4 2016-05-03 04:45:01 2016-05-03 13:37:02
5: 7 5 2016-05-03 13:37:02 2016-05-03 13:37:06
6: 0 6 2016-05-03 13:37:06 <NA>