r-对时间序列数据中的多条件阈值进行Rollapply或类似操作



我正试图在时间序列数据中查找超过多条件阈值的年度实例的日期。当每日温度超过B(B>=5.0;Mean_Temp(C天(C=5天;宽度(时,我使用rollapply函数来确定每年的第一个日期(让我们称之为A(。

样本数据:

DOY Year    Month   Day Mean_Temp
96  1960    4       5   1.5
97  1960    4       6   -1
98  1960    4       7   -1.9
99  1960    4       8   -2.3
100  1960    4       9   1.3
101  1960    4       10  -0.5
102  1960    4       11  5.9
103  1960    4       12  5.7
104  1960    4       13  5.3
105  1960    4       14  6.1
106  1960    4       15  9.9

样本代码:

Table <- data %>% group_by(Year) %>%
mutate(Mean_Temp=rollapply(Mean_Temp, width=5, min, align="right", fill=NA, na.rm=TRUE)) %>%
filter(Mean_Temp >=5.0) %>%
filter(row_number() == 1)

样本输出:

X       Year    Month   Day Mean_Temp
1   106     1960    4       15  5.3
2   466     1961    4       10  5.6
3   830     1962    4       9   5.6
4   1205    1963    4       19  5.6
5   1561    1964    4       9   5.6
6   1948    1965    5       1   7.8

然而,我现在想找到在aZ天内Y温度低于新阈值X(例如1960-04-15(的任何情况(如果发生(。例如,在上述日期后的28天内,温度何时降至-15以下?

我正在寻找的输出类型如下:

Year    Month   Day Mean_Temp
1960    4       16  -16.1
1960    4       19  -17.2
1961    4       14  -15.2
1961    4       15  -15.1
1963    4       30  -16.7
1963    5       1   -17.1
1964    4       16  -15.3
1964    4       17  -16.3

我想知道是否使用我的rollapply函数的输出来指示每年的开始日期(A(,以监测接下来C天的温度,看看它是否低于B。然而,我有点不知道如何对这种类型的函数进行编码,基本上是在给定日期(可能是从单独的表中引用的(之后每年循环查看每日温度数据,以观察特定的温度阈值。

这是一个数据样本。

structure(list(X = 1:20, Year = c(1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L), Month = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Day = 1:20, Mean_Temp = c(-12.2, -10, -2.3, -4.2, -7.2, -12.3, -6.1, -5, -12.5, -9.2, -9.2, -6.7, -4.2, -6.1, -4.7, -6.7, -6.1, -6.7, -8.1, -7.8)), row.names = c(NA, 20L), class = "data.frame")

我不知道你到底在寻找什么,但也许以下是正确的方向。

MEAN.TEMPERATURE.THRESHOLD <- -5.0
df <- structure(list(X = 1:20, Year = c(1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L, 1960L), Month = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Day = 1:20, Mean_Temp = c(-12.2, -10, -2.3, -4.2, -7.2, -12.3, -6.1, -5, -12.5, -9.2, -9.2, -6.7, -4.2, -6.1, -4.7, -6.7, -6.1, -6.7, -8.1, -7.8)), row.names = c(NA, 20L), class = "data.frame")
df <- subset(df, select = -X)

df$belowThreshold <- ifelse(df$Mean_Temp < MEAN.TEMPERATURE.THRESHOLD, TRUE, FALSE)
df$cumSumBelowThreshold <- with(df,
ave(belowThreshold,
cumsum(belowThreshold == 0),
FUN = cumsum))
df

最新更新