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
    按引用重新排列列
(请注意,我的结果看起来不像OP的结果,可能是因为给出了错误的
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>