2016-08-12 3 views
0

Ich habe einen Datenrahmen mit 2 Variablen: "Zeit" und "Temperatur". Die Variable "time" hat folgendes Format: "% Y-% m-% d% H:% M:% S". Ich möchte die Durchschnittstemperatur für jeden Tag und jede Nacht berechnen. Tage und Nächte sollten durch Sonnenauf- und Sonnenuntergangszeiten definiert werden, die in einem zweiten Datenrahmen gespeichert werden. Das bedeutet, dass Tag und Nacht unterschiedliche Start- und Endzeiten haben.Zeilen berechnen bedeutet in einem anderen Datenrahmen definierte Intervalle?

Also meine Frage ist: Wie kann ich die Durchschnittstemperatur für jeden Tag und Nacht, Tage und Nächte zu Sonnenaufgang und Sonnenuntergang Zeiten berechnen?

Der erste Datenrahmen, der die Temperaturen enthält wie folgt aussieht:

time_temp_data <- data.frame(
    time = seq(
    as.POSIXct("2013-05-24 15:01:01"), 
    as.POSIXct("2013-06-02 03:31:01"), 
    by = "3 min" 
    ), 
    temp = seq(7.153, 36.809, length.out = length(time)) 
) 

und der zweite Datenrahmen, die mal Sonnenaufgang und Sonnenuntergang enthält sieht wie folgt aus:

sunrise_sunset <- data.frame(
    event = rep(c("sunrise", "sunset"), 21), 
    time = as.POSIXct(c("2013-05-18 03:59:01", "2013-05-18 22:07:01", "2013-05- 19 03:57:01", "2013-05-19 22:09:01", "2013-05-20 03:55:01", 
          "2013-05-20 22:11:01", "2013-05-21 03:53:01", "2013-05-21 22:13:01", "2013-05-22 03:51:01", "2013-05-22 22:15:01", 
          "2013-05-23 03:49:01", "2013-05-23 22:18:01", "2013-05-24 03:47:01", "2013-05-24 22:20:01", "2013-05-25 03:45:01", 
          "2013-05-25 22:22:01", "2013-05-26 03:44:01", "2013-05-26 22:24:01", "2013-05-27 03:42:01", "2013-05-27 22:26:01", 
          "2013-05-28 03:40:01", "2013-05-28 22:27:01", "2013-05-29 03:38:01", "2013-05-29 22:29:01", "2013-05-30 03:37:01", 
          "2013-05-30 22:31:01", "2013-05-31 03:35:01", "2013-05-31 22:33:01", "2013-06-01 03:34:01", "2013-06-01 22:35:01", 
          "2013-06-02 03:32:01", "2013-06-02 22:36:01", "2013-06-03 03:31:01", "2013-06-03 22:38:01", "2013-06-04 03:30:01", 
          "2013-06-04 22:40:01", "2013-06-05 03:29:01", "2013-06-05 22:41:01", "2013-06-06 03:28:01", "2013-06-06 22:42:01", 
          "2013-06-07 03:28:01", "2013-06-07 22:44:01")) 

) 

Ein Ansatz sein würde füge die beiden Datenrahmen zusammen. Die gemeinsame Variable meiner zwei Datenrahmen ("Zeit") hat jedoch nicht genau die gleichen Daten. Das Ideal wäre dann, die Datenrahmen mit logischen Operatoren (≥, ≤) zusammenzuführen, aber das habe ich nicht geschafft.

BEARBEITEN
Frage wurde geändert und gilt nicht mehr als zu breit. Das Beispiel kann aus der Box heraus ausgeführt werden.

+1

Siehe [hier] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Bitte geben Sie ein Beispiel für Ihre Daten an –

+0

@Steve_Corrin Nun, da ich meine Frage bearbeitet und ein Beispiel für meine Daten angegeben habe, wie kann es wieder geöffnet werden? –

Antwort

1

Diese Lösung verwendet das Paket dplyr zum Bearbeiten von Datenrahmen, lubridate für die Manipulation von Datum und Uhrzeit und magrittr für das Zusammenführen von Befehlen.

library(dplyr) 
library(lubridate) 
library(magrittr) 

Hier ist ein Beispiel-Datensatz:

time_temp_data <- data.frame(
    time = seq(
    as.POSIXct("2016-08-11"), 
    as.POSIXct("2016-08-12 23:00:00"), 
    by = "1 hour", 
), 
    temp = rnorm(48) 
) 
sunrise_sunset_data <- data.frame(
    sunrise = as.POSIXct(c("2016-08-11 05:59:30", "2016-08-12 06:00:30")), 
    sunset = as.POSIXct(c("2016-08-11 21:00:30", "2016-08-12 20:59:30")) 
) 

Zuerst haben wir Spalten hinzufügen („mutiert“) zu den Datensätzen die Datums-Zeiten in Daten und Zeiten aufteilt.

time_temp_data %<>% 
    mutate_(
    date = ~ floor_date(time, "day"), 
    time_of_day = ~ difftime(time, date, "hours") 
) 

sunrise_sunset_data %<>% 
    mutate_(
    date = ~ floor_date(sunrise, "day"), 
    time_of_sunrise = ~ difftime(sunrise, date, "hours"), 
    time_of_sunset = ~ difftime(sunset, date, "hours") 
) 

Dann verbinden wir die Zeit/temp Daten an den Sonnenaufgang/Sonnenuntergang Daten:

all_data <- inner_join(time_temp_data, sunrise_sunset_data, by = "date") 

Nachtzeit ist, wenn die Tageszeit, nach Sonnenuntergang ist, oder vor Sonnenaufgang.

all_data %<>% 
    mutate_(
    is_night = ~ time_of_day > time_of_sunset | time_of_day < time_of_sunrise 
) 

Nun ist die mittlere Temperatur für jedes Datum und Tag/Nacht-Zeit kann durch die Gruppierung auf diesen Variablen und Rechen Zusammenfassung Statistiken berechnet werden.

all_data %>% 
    group_by_(~ date, ~ is_night) %>% 
    summarize_(mean_temp = ~ mean(temp)) 
Verwandte Themen