2016-10-04 7 views
-3

Ich benutze eine Kabeljau, wo ich Wärmewelle für aufeinanderfolgende Tage erkennen kann, aber ich kann nicht herausfinden, wie ich auch die Kabeljau die höchste mittlere Temperatur über jedes Hitzebindungsereignis aufgezeichnet bekommen kann . Der Header meiner Daten (Period1): Jahr Monat Tag Mittelwert MAX MINBerechnung der Durchschnitt über aufeinanderfolgende Tage, die eine Bedingung erfüllen

Meine Codes sind:

setDT(Period1) 
Period1[, hotday := +(Period1$MAX>=(quantile(Period1$MAX,.9, na.rm = T, type = 6)) & Period1$MIN>=(quantile(Period1$MIN,.8, na.rm = T, type = 6))) 
     ][, hw.length := with(rle(hotday), rep(lengths,lengths)) 
      ][hotday==0, hw.length:=0] 

Das Ergebnis des Code:

YEAR MONTH DAY MEAN MAX MIN hotday hw.length 
1 2005 7 1 34.7 42 28  0 0 
2 2005 7 2 35  41.8 28.8 0 0 
3 2005 7 3 34.6 41.5 27  1 2 
4 2005 7 4 35.4 43 27.6 1 2 
5 2005 7 5 35.4 42 27.4 0 0 
6 2005 7 6 34.4 42.2 27.7 0 0 
7 2005 7 7 34  39.3 28.6 1 4 
8 2005 7 8 34.9 40.6 29  1 4 
9 2005 7 9 35.7 41 28.2  1 4 
10 2005 7 10 35.1 42.2 28.5 1 4 
11 2005 7 11 34.9 42.5 29  0 0 
12 2005 7 12 35.5 43.2 28  0 0 
13 2005 7 13 36.1 43 29.2  1 3 
14 2005 7 14 36.4 43.4 32  1 3 
15 2005 7 15 36.5 44.5 29.2 1 3 
16 2005 7 16 36.2 42.6 31.2 0 0 
17 2005 7 17 34.6 40 30  0 0 
18 2005 7 18 33.7 41 28.8  0 0 

Für Hitzewelle auf 2005/7/3 und 2005/7/4 der höchste ist 35.6, wo für die zweite Hitzewelle, die auf 2005/7/7 starrte und endete auf 2005/7/10 der höchste Mittelwert war 35.7. Ich würde mich über jede Idee freuen, wie ich den höchsten Mittelwert jeder Hitzewelle unter Berücksichtigung der aufeinanderfolgenden Tage erfassen kann.

+0

, wenn Sie sagen, dass Sie können eine Hitzewelle "erkennen", kennen Sie das Start- und Enddatum der Hitzewelle? – nathanesau

+0

der Start ist, wenn die Maximal- und Minimaltemperaturen die 90. bzw. 80. überschreiten und das Ende ist, wenn diese Bedingung stoppt – Moore

+0

Ausführen von Code von oben auf den bereitgestellten Beispieldaten, ergibt nicht das gleiche Ergebnis für die 'Hotday' und 'hw.length' Variablen ..... Für beide Variablen wird alles auf Null gesetzt. – Jaap

Antwort

-2

ich nicht genau wissen, wie Sie Ihr Code in Details aussehen, aber hier ist ein Hinweis Period1 unter der Annahme, ein Datenrahmen ist:

die heiße Periode Auszug

hotPeriod <- Period1[, hotday := +(Period1$MAX>=(quantile(Period1$MAX,.9, na.rm = T, type = 6)) & Period1$MIN>=(quantile(Period1$MIN,.8, na.rm = T, type = 6))) 
    ][, hw.length := with(rle(hotday), rep(lengths,lengths)) 
    ][hotday==0, hw.length:=0] 

das Maximum des Mittels Extract Wert in diesem Zeitraum

max.of.mean <- max(hotPeriod$Mean) 
2

mit:

Period1[hotday == 1, maxmean := max(MEAN) , rleid(hw.length)][] 

Sie erhalten:

YEAR MONTH DAY MEAN MAX MIN hotday hw.length maxmean 
1: 2005  7 1 34.7 42.0 28.0  0   0  NA 
2: 2005  7 2 35.0 41.8 28.8  0   0  NA 
3: 2005  7 3 34.6 41.5 27.0  1   2 35.4 
4: 2005  7 4 35.4 43.0 27.6  1   2 35.4 
5: 2005  7 5 35.4 42.0 27.4  0   0  NA 
6: 2005  7 6 34.4 42.2 27.7  0   0  NA 
7: 2005  7 7 34.0 39.3 28.6  1   4 35.7 
8: 2005  7 8 34.9 40.6 29.0  1   4 35.7 
9: 2005  7 9 35.7 41.0 28.2  1   4 35.7 
10: 2005  7 10 35.1 42.2 28.5  1   4 35.7 
11: 2005  7 11 34.9 42.5 29.0  0   0  NA 
12: 2005  7 12 35.5 43.2 28.0  0   0  NA 
13: 2005  7 13 36.1 43.0 29.2  1   3 36.5 
14: 2005  7 14 36.4 43.4 32.0  1   3 36.5 
15: 2005  7 15 36.5 44.5 29.2  1   3 36.5 
16: 2005  7 16 36.2 42.6 31.2  0   0  NA 
17: 2005  7 17 34.6 40.0 30.0  0   0  NA 
18: 2005  7 18 33.7 41.0 28.8  0   0  NA 

Erklärung:

  • Filtern Sie die Daten nur für die heißen Tage: hotday == 1 (oder mit einem Code-Golf: !!hotday).
  • Für die verbleibenden Zeilen erstellen Sie eine Lauflängen-ID mit der rleid-Funktion, so dass Sie nach Hitzewelle gruppieren können: rleid(hw.length).
  • Schließlich extrahieren Sie den maximalen Mittelwert für jede Hitzewelle und weisen Sie sie einer neuen Spalte zu: maxmean := max(MEAN).

Wenn Sie nur die Maximalwerte für die Hitzewellen extrahieren möchten, können Sie verwenden:

> Period1[!!hotday, max(MEAN) , rleid(hw.length)]$V1 
[1] 35.4 35.7 36.5 

Gebrauchte Daten:

Period1 <- fread('YEAR MONTH DAY MEAN MAX MIN hotday hw.length 
2005 7 1 34.7 42 28  0 0 
2005 7 2 35  41.8 28.8 0 0 
2005 7 3 34.6 41.5 27  1 2 
2005 7 4 35.4 43 27.6 1 2 
2005 7 5 35.4 42 27.4 0 0 
2005 7 6 34.4 42.2 27.7 0 0 
2005 7 7 34  39.3 28.6 1 4 
2005 7 8 34.9 40.6 29  1 4 
2005 7 9 35.7 41 28.2  1 4 
2005 7 10 35.1 42.2 28.5 1 4 
2005 7 11 34.9 42.5 29  0 0 
2005 7 12 35.5 43.2 28  0 0 
2005 7 13 36.1 43 29.2  1 3 
2005 7 14 36.4 43.4 32  1 3 
2005 7 15 36.5 44.5 29.2 1 3 
2005 7 16 36.2 42.6 31.2 0 0 
2005 7 17 34.6 40 30  0 0 
2005 7 18 33.7 41 28.8  0 0') 
+0

Vielen Dank.Gibt es einen Weg, wo die Max-Werte nicht dupliziert werden, wie einer für jede Hitzewelle – Moore

Verwandte Themen