【问题标题】:rolling percentile for conditional selections in rr中条件选择的滚动百分位数
【发布时间】:2017-08-25 23:56:15
【问题描述】:

我有一个数据框,其中包含 40 年的每日最高和最低温度,需要选择最高温度高于最高温度 90% 且最低温度高于最低温度 85% 的所有日子。

我做到了

> 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% 是 15 天窗口中历史数据的第 90%天)

我的意思是使用 15 天的日历窗口从每个日历日的历史数据中计算出的百分位数。也就是说,有 365 天,所以对于第 118 天,我将使用第 111 天、第 112 天……到第 125 天的历史数据。所以在我的例子中,我有 40 年的数据,所以 15 天的窗口将每个日历日的总样本量为 40 年 × 15 天 = 600。移动窗口基于日历日,而不是时间序列

大家有什么意见

【问题讨论】:

    标签: r


    【解决方案1】:

    像这样选择你想要的行怎么样?

    由于您想要一个以感兴趣的日期为中心的 15 天的滑动窗口,因此您将始终拥有前 7 天 + 感兴趣的日期 + 后续 7 天的窗口。由于这个限制,数据集的前 7 天和最后 7 天(行)被排除并强制 == FALSE { rep(FALSE, 7) }

    sapply() 调用中包含的代码将每天(从第 n.(7+1=8) 天开始)针对 15 天滑动窗口(如前定义)进行测试,并检查最高温度是否更高超过该窗口的第 90 个百分位(test1)。执行一个类似的测试 (test2) 查看 MIN temp。如果两个测试之一为 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 个百分位来包含最低温度
    • 我为最低温度添加了一个测试。当您提到第 85 个百分位数时,我假设您想要 15% 的最冷天,因此概率为 0.15。我还添加了一个玩具数据集来展示测试的工作原理......
    • 非常感谢您的帮助。我的问题不是很清楚,我很抱歉。我的意思是使用 15 天日历窗口从每个日历日的历史数据中计算出的百分位数。也就是说,有 365 天,所以对于第 8 天,我们将使用第 1、2、......到第 15 天的历史数据。因此,就我而言,我有 40 年的数据,因此 15 天的窗口将产生 40 年 × 15 天 = 每个日历日 600 个的总样本量。所以移动窗口是基于日历天的,而不是时间序列。
    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2022-01-16
    • 2019-02-15
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    相关资源
    最近更新 更多