我正在寻求一个与优化的时间窗口滚动函数非常相关的问题的帮助。
我想计算我的函数(在下面的例子中是sum,但也可以很容易地是min或max或median...)在过去一段时间内的时间步长上,但不超过这个时间。因此,如果我感兴趣的时间持续8分钟,而我的时间步长为2,2,5,对于第三个时间步长,我只想对最后2个数字求和(这将给出总时间7),不包括第一个数字,因为它会给出总时间9。所以基本上我想要尽可能接近我的持续时间,但不要超过。
为了背景,这些值是降雨数据,mindiff 是记录间隔。因此,如果我的时间步长为5分钟,则雨水可能发生在那5分钟的任何时间。我只想找到我能够保证在过去8分钟内降落的雨水,所以任何开始时间在8分钟前的时间步长我都不能确定,我想要排除。
下面的代码非常接近我想要的内容(从上述提到的Uwe的答案进行了调整),但它包括一个点之前,除非间隔恰好等于我的持续时间。我也希望它在时间步长大于持续时间时变为NA,但这很容易在实现后完成。
附带一个期望输出的例子:
library(tibble)
library(data.table)
set.seed(1)
testdf <- tibble(mindiff = c(1,2,1,2,5,2,2,2,11,5,3,2,0,1),
DateTime = as.POSIXct("2019-01-01 00:00", z = "Etc/GMT-10")+(cumsum(mindiff)*60),
Value = round(runif(14,0,5),1))
dur8= 60*8
testdf[["Total8Min"]] <- setDT(testdf)[, rn := .I][.(ur = rn, ud = DateTime, ld = DateTime - dur8),
on = .(rn <= ur, DateTime <= ud, DateTime > ld),
sum(as.double(Value)), by = .EACHI]$V1
testdf$desiredOut <- c(1.3,3.2,6.1,10.6,8.4,5.5,9.2,12.5,NA, 0.3,1.3,1.9,5.3,7.2)
这篇文章是由reprex包(v0.3.0)于2019-08-21创建的
我在data.table
方面有些陌生,我更熟悉tidyverse
,如果有人能提供tidyverse
方法,我会很高兴。
进一步解释回复中所说的:在我的期望输出中,我只希望第6行输出为5.5,这是在最后2分钟(从00:11到00:13)和在此之前的5分钟内(从00:06到00:11)下降的雨量。我不想包括第4行的值,因为这场雨可能在00:04到00:06之间的任何时间下降 - 可能都在现在时间(第6行)8分钟之前的00:05之前下降。
desiredOut
中的所有数字都是正确的吗?例如,对于第6行输出,如果我们回溯8分钟,我们应该添加4.5 + 4.5 + 1
,即10,但是你的期望输出只添加了4.5 + 1
。 - Ronak Shah