【发布时间】:2020-01-27 02:25:22
【问题描述】:
我有一个带有虚拟数据的数据框:
library("lubridate")
library("dplyr")
df <- data.frame(
time = seq.POSIXt(from = ymd_hms("2017-05-12 00:00:00"), to = ymd_hms("2017-05-12 02:25:00"), by = "5 mins"),
value = c(rep(0, 10), 1500, 0, 1000, rep(0,17))
)
看起来像这样:
time value
1 2017-05-12 00:00:00 0
2 2017-05-12 00:05:00 0
3 2017-05-12 00:10:00 0
4 2017-05-12 00:15:00 0
5 2017-05-12 00:20:00 0
6 2017-05-12 00:25:00 0
7 2017-05-12 00:30:00 0
8 2017-05-12 00:35:00 0
9 2017-05-12 00:40:00 0
10 2017-05-12 00:45:00 0
11 2017-05-12 00:50:00 1500
12 2017-05-12 00:55:00 0
13 2017-05-12 01:00:00 1000
14 2017-05-12 01:05:00 0
15 2017-05-12 01:10:00 0
16 2017-05-12 01:15:00 0
17 2017-05-12 01:20:00 0
18 2017-05-12 01:25:00 0
19 2017-05-12 01:30:00 0
20 2017-05-12 01:35:00 0
21 2017-05-12 01:40:00 0
22 2017-05-12 01:45:00 0
23 2017-05-12 01:50:00 0
24 2017-05-12 01:55:00 0
25 2017-05-12 02:00:00 0
26 2017-05-12 02:05:00 0
27 2017-05-12 02:10:00 0
28 2017-05-12 02:15:00 0
29 2017-05-12 02:20:00 0
30 2017-05-12 02:25:00 0
我想创建一个标志变量来指示活动,它将包括值大于零的瞬间,以及下一个完整小时作为“1”/“开启”。
因此,如果在 00:50 有 1500 个值,那么活动应该持续到 01:50(包括 01:50)。
如果在该时间段内有另一个非零值,则活动也必须继续下一小时。
最终产品将如下所示:
time value flag
1 2017-05-12 00:00:00 0 OFF
2 2017-05-12 00:05:00 0 OFF
3 2017-05-12 00:10:00 0 OFF
4 2017-05-12 00:15:00 0 OFF
5 2017-05-12 00:20:00 0 OFF
6 2017-05-12 00:25:00 0 OFF
7 2017-05-12 00:30:00 0 OFF
8 2017-05-12 00:35:00 0 OFF
9 2017-05-12 00:40:00 0 OFF
10 2017-05-12 00:45:00 0 OFF
11 2017-05-12 00:50:00 1500 ON
12 2017-05-12 00:55:00 0 ON
13 2017-05-12 01:00:00 1000 ON
14 2017-05-12 01:05:00 0 ON
15 2017-05-12 01:10:00 0 ON
16 2017-05-12 01:15:00 0 ON
17 2017-05-12 01:20:00 0 ON
18 2017-05-12 01:25:00 0 ON
19 2017-05-12 01:30:00 0 ON
20 2017-05-12 01:35:00 0 ON
21 2017-05-12 01:40:00 0 ON
22 2017-05-12 01:45:00 0 ON
23 2017-05-12 01:50:00 0 ON <-- first occurrence stops having effect
24 2017-05-12 01:55:00 0 ON <-- effect of second occurrence
25 2017-05-12 02:00:00 0 ON <-- continues the activity then stops
26 2017-05-12 02:05:00 0 OFF
27 2017-05-12 02:10:00 0 OFF
28 2017-05-12 02:15:00 0 OFF
29 2017-05-12 02:20:00 0 OFF
30 2017-05-12 02:25:00 0 OFF
坦率地说,我不知道如何将此任务分解为可行的 for 循环或函数。非常感谢任何帮助或线索。
更新
感谢@akrun,我有一些代码基础。但是,现在我试图确保该函数还拾取任何以下非零值,就像 1500 之后的 1000 一样,并从最后一个非零值继续活动标志,而不是第一个.
作者:阿克伦:
time value flag
<dttm> <dbl> <chr>
1 2017-05-12 00:00:00 0 OFF
2 2017-05-12 00:05:00 0 OFF
3 2017-05-12 00:10:00 0 OFF
4 2017-05-12 00:15:00 0 OFF
5 2017-05-12 00:20:00 0 OFF
6 2017-05-12 00:25:00 0 OFF
7 2017-05-12 00:30:00 0 OFF
8 2017-05-12 00:35:00 0 OFF
9 2017-05-12 00:40:00 0 OFF
10 2017-05-12 00:45:00 0 OFF
11 2017-05-12 00:50:00 1500 ON
12 2017-05-12 00:55:00 0 ON
13 2017-05-12 01:00:00 1000 ON
14 2017-05-12 01:05:00 0 ON
15 2017-05-12 01:10:00 0 ON
16 2017-05-12 01:15:00 0 ON
17 2017-05-12 01:20:00 0 ON
18 2017-05-12 01:25:00 0 ON
19 2017-05-12 01:30:00 0 ON
20 2017-05-12 01:35:00 0 ON
21 2017-05-12 01:40:00 0 ON
22 2017-05-12 01:45:00 0 ON
23 2017-05-12 01:50:00 0 ON
24 2017-05-12 01:55:00 0 OFF <-- wrongly flagged as OFF
25 2017-05-12 02:00:00 0 OFF <-- wrongly flagged as OFF
26 2017-05-12 02:05:00 0 OFF
27 2017-05-12 02:10:00 0 OFF
28 2017-05-12 02:15:00 0 OFF
29 2017-05-12 02:20:00 0 OFF
30 2017-05-12 02:25:00 0 OFF
【问题讨论】:
标签: r function dataframe time-series flags