我正试图在时间序列数据中查找超过多条件阈值的年度实例的日期。当每日温度超过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
然而,我现在想找到在a的Z天内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