2017-08-24 119 views
0

我有一個數據框架,每天的最高和最低溫度爲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。移動窗口是基於

任何想法請

回答

0

關於這樣的事情,選擇行你要什麼日曆天,而不是時間序列?

既然您想要一個以感興趣的日子爲中心的滑動窗口爲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 
+0

感謝。你能否解釋一下代碼,比如#7和8的意思。請注意,我必須包含使用第85百分位的最低溫度 – Ali

+0

我添加了最低溫度測試。當你提到第85百分位數時,我假設你想要15%的最冷天,因此可能是0.15。我還添加了一個玩具數據集來展示測試如何進行...... –

+0

我非常感謝您的幫助。我的問題不是很清楚,我的道歉。我的意思是,使用15天日曆窗口從每個日曆的歷史數據計算百分比。也就是說,有365天,因此在第8天我們將使用第1天,第2天,第15天的歷史數據。所以在我的情況下,我有40年的數據,所以15天的窗口將產生每個日曆日40年×15天= 600的總樣本量。所以移動窗口基於日曆日,而不是時間序列。 – Ali