滚动百分比条件选择r
问题描述:
我有一个数据框架,每天的最高和最低温度为40年,需要选择最高温度超过第90百分位的最高温度和最低温度超过第85百分位的最低温度温度。滚动百分比条件选择r
我能做到这一点
> head(df)
YEAR MONTH DAY Date MEAN MAX MIN
1 1965 1 1 1/1/1965 NA 27.0 17.0
2 1965 1 2 1/2/1965 24.0 28.0 20.7
3 1965 1 3 1/3/1965 19.9 23.7 16.2
4 1965 1 4 1/4/1965 18.0 23.4 12.0
5 1965 1 5 1/5/1965 19.7 24.0 14.0
6 1965 1 6 1/6/1965 18.6 24.0 13.0
df[, hotday := +(df$MAX>=(quantile(df$MAX,.90, na.rm = T, type = 6)) & df$MIN>=(quantile(df$MIN,.85, na.rm = T, type = 6)))
] [, length := with(rle(hotday), rep(lengths,lengths)) # to calculate lenght so I can select consecutive days only
] [hotday==0, length:=0][!!hotday, Highest_Mean := max(MEAN) , rleid(length)][] # to find the highest Mean temp for each consecutive group
但我需要使用中心滚动百分每15天(即,对于给定的一天,最高气温90百分位是90到做同样的事情以当天为中心的15天窗口的历史数据的百分位数)
我的意思是百分位数是根据每个日历日的历史数据使用15天日历窗口计算的。也就是说,在第118天我将有365天,我将使用第111,112,......天的历史数据到第125天。所以在我的情况下,我有40年的数据,所以15天的窗口将会每个日历日的总样本量为40年×15天= 600。移动窗口是基于
任何想法请
答
关于这样的事情,选择行你要什么日历天,而不是时间序列?
既然您想要一个以感兴趣的日子为中心的滑动窗口为15天,那么您将始终拥有7天前的天数+感兴趣的天数+7天以后的窗口。由于这个约束,排除了数据集的前7天和最后7天(行),并且强制== FALSE {rep(FALSE,7)}
sapply()调用中包含的代码将测试每个(从第n天开始(7 + 1 = 8))到15天的滑动窗口(如之前定义的),并检查最高温度是否高于该窗口的第90百分位(test1)。一个类似的测试(test2)是在MIN温度下执行的。如果两个测试中的一个测试结果为TRUE,则返回TRUE(否则,输出FALSE,您可以轻松地根据您的需求进行调整)。
生成的向量(存储在KEEP向量中)包含可用于对初始数据帧进行子集的布尔值TRUE/FALSE。
set.seed(111)
df <- data.frame(MIN=sample(50:70, size = 50, replace = T),
MAX=sample(70:90, size = 50, replace = T))
head(df)
KEEP <- c(rep(FALSE, 7),
sapply(8:(length(df$MAX) - 7), (function(i){
test1 <- df$MAX[i] >= as.numeric(quantile(df$MAX[(i-7):(i+7)], 0.9, na.rm = TRUE))
test2 <- df$MIN[i] <= as.numeric(quantile(df$MIN[(i-7):(i+7)], 0.15, na.rm = TRUE))
test1 | test2
})),
rep(FALSE, 7))
head(KEEP)
df <- df[KEEP,]
df
这应返回
MIN MAX
10 51 86
13 51 73
14 50 75
15 53 89
22 55 83
28 55 90
31 51 72
32 60 88
37 52 84
42 56 87
感谢。你能否解释一下代码,比如#7和8的意思。请注意,我必须包含使用第85百分位的最低温度 – Ali
我添加了最低温度测试。当你提到第85百分位数时,我假设你想要15%的最冷天,因此可能是0.15。我还添加了一个玩具数据集来展示测试如何进行...... –
我非常感谢您的帮助。我的问题不是很清楚,我的道歉。我的意思是,使用15天日历窗口从每个日历的历史数据计算百分比。也就是说,有365天,因此在第8天我们将使用第1天,第2天,第15天的历史数据。所以在我的情况下,我有40年的数据,所以15天的窗口将产生每个日历日40年×15天= 600的总样本量。所以移动窗口基于日历日,而不是时间序列。 – Ali