2016-05-12 13 views
-1

Ich habe eine Zeitreihe von täglichen Niederschlagswerten, die 1838 beginnen und 2001 enden. Es gibt einige fehlende Tage in der Aufzeichnung, die mit einer NA codiert sind. Meine Daten nehmen die Form:Entfernen Sie alle Werte in einem Monat, in denen innerhalb dieses Monats irgendwelche NA-Werte auftreten.

Year Month Day PPT 

1838 1 1 0.0 
1838 1 2 NA 
1838 1 3 1.3 
1838 1 4 0.6 

ich jetzt eine Aggregatfunktion bin mit den täglichen Niederschlagssummen in Monatsmittel pro Jahr der Aufzeichnung summieren mit:

aggregate(PPT~Year, df, sum) 

Dies funktioniert gut, aber das Problem ist, dass einige der monatlichen aggregierten Summen nicht echt sind. Wenn zum Beispiel im Januar 1838 20 fehlende Tage vorlägen, wäre die aggregierte Summe für diesen Monat nicht echt.

Was ich tun möchte, ist für meine aggregierte Funktion nicht aggregierte Summen für Monate mit fehlenden Tagen (NA) zurückzugeben, d. H. Wenn sogar nur 1 Tag fehlt, möchte ich den Monat nicht zurückgegeben werden. Alternativ könnte ich alle Monate, die irgendwelche NA-Werte enthalten, vor der Aggregation entfernen.

+0

Versuchen Sie 'sum (c (NA, 1,2,3))'. – zx8754

+0

Dies erzeugt einen einzelnen NA-Wert und hilft leider nicht in dieser Situation. –

+0

Es war nur ein Tipp, wir könnten nach JahrMonat aggregieren, um Summen aus Monaten zu entfernen, die nicht * echt * sind, und dann nach Jahr aggregieren. – zx8754

Antwort

1
df_precipitation     <- data.frame(
    Year = rep(x = 2016, times = 61), 
    Month = rep(x = c(5, 6), times = c(31, 30)), 
    Day = c(1:31, 1:30), 
    PPT = c(NA, sample(x = 100, size = 60)) 
) 

df_aggregated     <- aggregate(
    formula = PPT ~ Year + Month, 
    data = df_precipitation, 
    FUN = sum, 
    na.action = na.pass 
) 

df_aggregated     <- na.omit(object = df_aggregated) 

der Code erstellt die data.frame mit einigen Mock Daten und macht die Aggregation von Jahr und Monat mit na.action = na.pass

Wenn ein Monat einen NA-Wert für den Niederschlag hat, stellt na.pass sicher, dass die sum() -Funktion auch den NA-Wert erhält. Und durch Standard sum() Funktion gibt NA, wenn eine der Eingangswerte NA

Dann tun wir na.omit, die die Zeilen mit der Summe als NA wegwirft

, die die Aggregatfunktion macht nicht zurück aggregierte Summen für alle Monate mit fehlenden Tagen

+0

Dies funktioniert auch sehr gut - danke. –

1

Dies könnte möglicherweise funktionieren die dplyr Bibliothek die Daten mit Hilfe ich verwendet habe, ist wie folgt, habe ich eine zusätzliche Zeile mit einem anderen Monat hinzugefügt

structure(list(year = c(1838, 1838, 1838, 1838, 1838), month = c(1, 1, 1, 1,2), day = c(1, 2, 3, 4, 1), ppt = c(0, NA, 1.3, 0.6, 0.1)), .Names = c("year", "month", "day", "ppt"), row.names = c(NA, -5L), class = "data.frame") 

df %>% group_by(year,month) %>% summarise(s = sum(ppt)) 

Die Ergebnisse dieser korrekt die Ergebnisse zu zeigen, wie folgt sind, wobei s die Summe aller Werte innerhalb dieses Monats

year month  s 
(dbl) (dbl) (dbl) 
1 1838  1 NA 
2 1838  2 0.1 
+0

Dies erzeugt nur eine zusätzliche Spalte in der Datenmenge namens s mit vielen Zahlen, die keinen Sinn machen. –

+0

Vielen Dank - das funktioniert super. Dumme Frage wahrscheinlich, aber wie mache ich das zu einem Datenrahmen? Im Moment druckt das die Lösung, aber ich kann dann nichts weiter damit anfangen, außer es ist ein benanntes Objekt wie ein Datenrahmen. –

+0

new_df <- df %>% group_by (Jahr, Monat)%>% Zusammenfassung (s = Summe (ppt)) – theArun

Verwandte Themen