如何在Rstudio中对翻斗式雨量计数据执行滚动条件计算?

问题描述 投票:0回答:1

我目前正在编写一个 R 脚本,用于分析从国家森林收集的翻斗式雨量计数据。这些翻斗式雨量计设计用于每个桶尖收集 0.01 英寸的水,并在发生时线性计数。例如,检索计量器后,计数为 5.00,这意味着水桶倾斜了 500 次,收集了 5.00 英寸的雨水。

在这个 R 脚本中,我想分析瞬时高强度降雨事件的数据。这些降雨事件的特点是在 15 分钟内收集 >= 0.25 英寸的水。该数据集非常大,因此手动识别这些事件是不切实际的。我想知道是否可以创建一个窗口大小为 15 分钟的滚动计算。此滚动总和将利用两列,一列日期时间 (POSIXct) 和一列事件提示(双精度)。该窗口将获取 0:00 的小费,并从 15:00 的小费中减去它,从而给出该 15 分钟窗口内的总降雨量。这将向前滚动,直到数据集完成。理想的输出是一个 double 类型的列,给出每个 15 分钟段的总降雨量。或者,新列可以是逻辑类型,如果窗口 >= 0.25 英寸,则输出 TRUE。

Segment of Data in Rstudio

这是 R 中的一小部分数据。主要问题之一是行/提示之间的时间间隔不一致。部署期间可能会完全跳过某些日子。如果您有任何想法、建议和/或解决方案,请告诉我。

祝你有美好的一天!

r rolling-computation posixct custom-rolling-window
1个回答
0
投票

您可以创建一个包含两列的新数据框。其中一个称为

start
,是从测量周期开始到结束每 15 分钟一次。第二列称为
stop
,与第一列相同,只是晚了 15 分钟。

然后,按行对数据框进行分组,只需计算开始时间和停止时间之间有多少个提示:

library(tidyverse)

tibble(start = seq(as.POSIXct('2023-06-08'), by = '15 min', len = 96 * 6),
       stop = start + lubridate::minutes(15)) %>%
  filter(complete.cases(.)) %>%
  rowwise() %>%
  mutate(tips = length(which(df$DateTime >= start & df$DateTime < stop)))
#> # A tibble: 576 x 3
#> # Rowwise: 
#>    start               stop                 tips
#>    <dttm>              <dttm>              <int>
#>  1 2023-06-08 00:00:00 2023-06-08 00:15:00     0
#>  2 2023-06-08 00:15:00 2023-06-08 00:30:00     0
#>  3 2023-06-08 00:30:00 2023-06-08 00:45:00     0
#>  4 2023-06-08 00:45:00 2023-06-08 01:00:00     1
#>  5 2023-06-08 01:00:00 2023-06-08 01:15:00     0
#>  6 2023-06-08 01:15:00 2023-06-08 01:30:00     0
#>  7 2023-06-08 01:30:00 2023-06-08 01:45:00     0
#>  8 2023-06-08 01:45:00 2023-06-08 02:00:00     0
#>  9 2023-06-08 02:00:00 2023-06-08 02:15:00     0
#> 10 2023-06-08 02:15:00 2023-06-08 02:30:00     0
#> # ... with 566 more rows
#> # i Use `print(n = ...)` to see more rows

使用的数据 - 使用 OCR 从相关数据图片中获取

df <- structure(list(DateTime = structure(c(1686182399, 1686231919, 
1686515980, 1686516586, 1686580500, 1686581191, 1686582039, 1686585522, 
1686586899, 1686587520, 1686588807, 1686589302, 1686589641, 1686639178, 
1686640430, 1686641549, 1686643287, 1686645039, 1686646602, 1686657085, 
1686658572, 1686660764, 1686660826, 1686660934), class = c("POSIXct", 
"POSIXt"), tzone = ""), Event = c(0, 0.01, 0.02, 0.03, 0.04, 
0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 
0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -24L))
© www.soinside.com 2019 - 2024. All rights reserved.