在满足阈值之前和之后的时间范围内存储数据

时间:2017-07-04 18:34:49

标签: r dataframe timestamp subset

我有一个数据框,其中包含一个带有时间戳的列(称为“Timestamp”)和一个包含空气污染物浓度的列(称为“值”)。

data frame

我有空气污染物的阈值,例如11(例如),并且想要在达到阈值之前的5小时内绘制浓度与时间的关系图,直到所有出现的阈值达到阈值后24小时为止。浓度达到或超过11。

我想我可以弄清楚图形,但此时我的主要问题是在满足阈值之前和之后的时间段内对数据进行子集化和存储。关于如何做到这一点的任何想法?

感谢。

1 个答案:

答案 0 :(得分:0)

我为下面的代码道歉,有点令人困惑。但是,我认为它应该是这样的:

require(tidyverse)
require(lubridate)

# Create example data
timestamp <- c("2017-01-01 00:00:00", "2017-01-01 01:00:00", "2017-01-01 02:00:00",
           "2017-01-01 03:00:00", "2017-01-01 04:00:00", "2017-01-01 05:00:00",
           "2017-01-01 06:00:00", "2017-01-01 07:00:00", "2017-01-01 08:00:00",
           "2017-01-01 09:00:00", "2017-01-01 10:00:00", "2017-01-01 11:00:00")

value <- c(8, 10, 12, 13, 10, 2, 3, 6, 5, 8, 6, 7)

df <- data.frame(timestamp = ymd_hms(timestamp), value = value)

# Find incidents with values over 11
df %>%
  mutate(treshold = ifelse(value >= 11, 1, 0)) %>%
  filter(treshold == 1) %>%
  .$timestamp-> incidents

# Create new data frame to store final data
final_df <- data.frame()

# Loop over incidents and filter for relevant data points
for (i in seq(length(incidents))){
  df %>%
    filter(timestamp %in% (incidents[i] + dhours(-5:24))) %>%
    mutate(id = i) %>%
    rbind(final_df, .) -> final_df
}

您现在可以使用最终数据框来创建绘图。因此,您可以使用id列过滤每个事件。

或者,您可以运行以下代码为每个事件创建一个独特的图表:

ggplot(final_df, aes(x = timestamp, y = value)) + geom_line() + facet_wrap(~id)

Plot