我无法绕过某些时间序列数据创建一系列间隔。
如果我的数据框(df)包含日期,浓度以及浓度是否超过5的阈值:
df <- structure(list(DATE = structure(c(1356183950, 1356184851, 1356185750,
1356186650, 1356187551, 1356188450, 1356189350, 1356190250, 1356191150,
1356192050, 1356192950, 1356193851, 1356194750, 1356195650, 1356196550,
1356197450), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
CONC = c(3.8, 3.8, 3.7, 4.3, 5, 6, 7.2, 7, 6, 5, 4.3,
3.7, 3.4, 3.3, 3.1, 3), EXCEED = c(0, 0, 0, 0, 1, 1, 1, 1,
1, 1, 0, 0, 0, 0, 0, 0)), .Names = c("DATE", "TURBIDITY",
"EXCEED"), row.names = 1070:1085, class = "data.frame")
我想根据低于或高于阈值的连续测量值创建每个时间段的间隔,并返回汇总统计信息,例如:
START END MAXCONC
1 2012-12-22 13:45:50 2012-12-22 14:30:50 4.3
2 2012-12-22 14:45:51 2012-12-22 16:00:50 7.2
3 2012-12-22 16:15:50 2012-12-22 17:30:50 4.3
我无法弄清楚如何使用lubridate创建不同的间隔。我应该使用另一个套餐吗?想法?
答案 0 :(得分:2)
这是一个快速data.table
解决方案。我已使用development version on GitHub中的rleid
函数,但您可以使用基本R rle
函数
library(data.table) # v>=1.9.5
setDT(df)[, .(
START = min(DATE),
END = max(DATE),
MAXCONC = max(TURBIDITY)
),
by = rleid(EXCEED)]
## rleid START END MAXCONC
## 1: 1 2012-12-22 13:45:50 2012-12-22 14:30:50 4.3
## 2: 2 2012-12-22 14:45:51 2012-12-22 16:00:50 7.2
## 3: 3 2012-12-22 16:15:50 2012-12-22 17:30:50 4.3
答案 1 :(得分:1)
我只是添加了我确定的实现(即,使用data.table::rleid
和dplyr
替代解决方案。
library(data.table) # v >= 1.9.5
library(dplyr)
df %>%
group_by(RUN = data.table::rleid(EXCEED)) %>%
summarize(START = min(DATE),
END = max(DATE),
MAX = max(TURBIDITY)) %>%
mutate(DURATION_HRS = as.numeric((END - START)/60))
# RUN START END MAX DURATION_HRS
# 1 2012-12-22 13:45:50 2012-12-22 14:30:50 4.3 0.75000
# 2 2012-12-22 14:45:51 2012-12-22 16:00:50 7.2 1.24972
# 3 2012-12-22 16:15:50 2012-12-22 17:30:50 4.3 1.25000