我有一个带有时间戳和数字变量的数据框,该数据每小时记录一次。最终,我很想知道变量达到或低于某个特定值的平均小时数。例如,data = 12/05/2018
data = datetime.strptime(data_, '%d/%m/%Y')
等于或小于4的平均小时数是多少?数据帧中缺少时间戳,因此,如果时间不连续,则需要重新启动。
在示例数据帧中,var1
和HoursBelow5
列是“手动”生成的,如果我可以以编程方式创建这些列,则可以进行过滤以删除RunningGroup
与大于4的RunningGroup
值相关联,然后使用var1
获得每个组的最大dplyr::slice
。然后我可以找到这些值的平均值。
因此,在这种方法中,我需要创建重新启动的累积总和HoursBelow5
,当不满足条件HoursBelow5
<5或时间戳记不是连续小时时,它将重新启动。然后,我可以使用var1
语句创建ifelse
变量。这可能吗?我可能没有找到该程序的行话。 RunningGroup
和Cumsum
看起来很有希望,但是我还没有构建完成上述操作的过程。
或者,使用时间戳可以有一种更聪明的方法。
编辑:结果包含以下答案中的代码
lag
答案 0 :(得分:2)
可以使用dplyr
和data.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
,则可以同时使用group
和group1
。