【问题标题】:Storing data in time range before and after threshold value is met在达到阈值之前和之后的时间范围内存储数据
【发布时间】:2024-01-14 14:38:01
【问题描述】:

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

我有一个空气污染物的阈值,例如 11(例如),并且想绘制达到阈值前 5 小时到达到阈值后 24 小时内所有发生的浓度与时间的关系图浓度达到或超过11。

我想我可以画出图表,但此时我的主要问题是对达到阈值前后期间的数据进行子集化和存储。关于如何做到这一点的任何想法?

谢谢。

【问题讨论】:

  • 请提供您的数据示例。
  • 实际上,我们可以复制的数据集 (dput) 会更容易使用,但我会尝试构建一个最小的示例。

标签: r dataframe timestamp subset


【解决方案1】:

对于以下代码有点混乱,我深表歉意。但是,我认为它应该像这样工作:

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)

【讨论】:

  • 嗨@Niko,当我尝试运行循环时出现以下错误:Error in filter_impl(.data, quo) : Evaluation error: 'match' requires vector arguments.
  • 使用自己的数据或者我的示例数据会不会出现这个错误?
  • 用我自己的数据。我读入了我的一个文件并将其命名为“df”,然后分段实现了您的代码,并且在应用循环时发生了错误。
  • 嗯好的。我不确定,但您的时间戳变量是否有可能不是日期时间格式?我在示例数据的最后一行使用ymd_hms(timestamp) 对其进行了转换。
  • 哦,抱歉,我犯了一个愚蠢的错误,“时间戳”需要大写 T。代码有效。谢谢!
最近更新 更多