满足条件时连续的总小时数

时间:2019-08-13 02:01:51

标签: r dplyr timestamp lubridate

我有一个带有时间戳和数字变量的数据框,该数据每小时记录一次。最终,我很想知道变量达到或低于某个特定值的平均小时数。例如,data = 12/05/2018 data = datetime.strptime(data_, '%d/%m/%Y') 等于或小于4的平均小时数是多少?数据帧中缺少时间戳,因此,如果时间不连续,则需要重新启动。

在示例数据帧中,var1HoursBelow5列是“手动”生成的,如果我可以以编程方式创建这些列,则可以进行过滤以删除RunningGroup与大于4的RunningGroup值相关联,然后使用var1获得每个组的最大dplyr::slice。然后我可以找到这些值的平均值。

因此,在这种方法中,我需要创建重新启动的累积总和HoursBelow5,当不满足条件HoursBelow5 <5或时间戳记不是连续小时时,它将重新启动。然后,我可以使用var1语句创建ifelse变量。这可能吗?我可能没有找到该程序的行话。 RunningGroupCumsum看起来很有希望,但是我还没有构建完成上述操作的过程。

或者,使用时间戳可以有一种更聪明的方法。

编辑:结果包含以下答案中的代码

lag

1 个答案:

答案 0 :(得分:2)

可以使用dplyrdata.table::rleid的一种方法是

library(dplyr)

df %>%
   group_by(group = data.table::rleid(var1 > 4), 
            group1 = cumsum(ts - lag(ts, default = first(ts)) > 3600)) %>%
   mutate(temp = row_number() * (var1 <= 4)) %>%
   ungroup() %>%
   select(ts, var1, HoursBelow5, temp)

#   ts                   var1 HoursBelow5  temp
#   <dttm>              <int>       <int> <int>
# 1 1900-01-01 12:46:46     1           1     1
# 2 1900-01-01 13:46:46     3           2     2
# 3 1900-01-01 14:46:46     4           3     3
# 4 1900-01-01 15:46:46     5           0     0
# 5 1900-01-01 16:46:46     4           1     1
# 6 1900-01-01 17:46:46     3           2     2
# 7 1900-01-01 18:46:46     5           0     0
# 8 1900-01-01 19:46:46     6           0     0
# 9 1900-01-01 20:46:46     7           0     0
#10 1900-01-01 21:46:46     8           0     0
# … with 29 more rows

temp列是通过编程生成的列,并且HoursBelow5保持不变以用于比​​较。如果还需要RunningGroup,则可以同时使用groupgroup1