2017-08-24 4 views
0

私は40.日の最高気温と最低気温を持つdata.frameを持っており、最高気温の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 

ことを行うことができた。しかし、私は(すなわち、特定の日のために、最高温度の90パーセンタイルは90番目であるごとに15日間を中心とローリングパーセンタイルを使用して同じことを行う必要があります

15日間のカレンダーウィンドウを使用して、各暦日の履歴データから計算される百分位数を意味します。つまり、365日がありますので、118日目には、111日目、112日目、... 125日目までの履歴データを使用します。したがって、私のケースでは、40日間のデータがあるため、15日間のウィンドウが表示されます。 40年×15日= 600の合計サンプルサイズを各暦日に生成する。移動ウィンドウは、暦日ではなく、時系列

任意の考えに基づいていてください

答えて

0

このような何かについてあなたがしたい行を選択するにはどのような?

興味のある日を中心に15日のスライディングウィンドウが必要なので、前日の7日+興味のある日+ 7日のウィンドウが常にあります。この制約のため、データセットの最初の7日と最後の7日(行)は除外され、強制的に== FALSE {rep(FALSE、7)}

sapply (前に定義したように)15日間のスライドウィンドウに対して(1日目(7 + 1 = 8)から開始して)、最大温度がそのウィンドウの90パーセンタイル(test1)より高いかどうかをチェックします。 MIN tempを見て同様のテスト(test2)が実行されます。 2つのテストのうち1つが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が意味するようなコードを説明してください。 Min tempを85パーセンタイルを使用して含める必要があります。 – Ali

+0

最小温度のテストを追加しました。 85パーセンタイルについて言及するとき、私はあなたが15%の最も寒い日を望んでいると仮定します。したがって、0.15の問題です。また、テストの仕組みを示すおもちゃのデータセットを追加しました。 –

+0

私は本当にあなたの助けに感謝しています。私の質問は明らかではなかった、私の謝罪。 15日間のカレンダーウィンドウを使用して、各カレンダーの履歴データからパーセンタイルを計算することを意味しました。すなわち、365日があるので、8日目には、1日目、2日目、······day15日の履歴データを使用します。したがって、私の場合、私は40年間のデータを持っているので、15日間のウィンドウでは、40年×15日= 600の合計サンプルサイズが各暦日に得られます。したがって、移動するウィンドウは時系列ではなく暦日に基づいています。 – Ali