2016-05-11 13 views
2

Ich bin ein Anfänger in R und ich möchte die Durchschnittstemperatur über einen bestimmten Zeitraum berechnen. Ich habe zwei Datensätze:Berechnen Sie die Durchschnittstemperatur (abgeleitet von anderen Datensätzen) über Anfangs- und Enddatum in der gleichen Zeile

  1. Datensatz mit dem Startdatum (date_fixed) und Enddatum (date_broken)

    ds <- data.frame( date_fixed= c("16-3-2015", "19-3-2015"), 
            date_broken = c("18-3-2015", "22-3-2015")) 
    
    ds$date_broken <- dmy(ds$date_broken) 
    ds$date_fixed <- dmy(ds$date_fixed) 
    
  2. Datensatz mit der Temperatur pro Tag:

    weather <- data.frame(date = c("16-3-2015", "17-3-2015", "18-3-2015", 
    "19-3-2015", "20-3-2015", "21-3-2015"), temperature = c("10", 
    "11", "12", "11", "12", "11")) 
    weather$date <- dmy(weather$date) 
    

Meine gewünschte Ausgabe würde so aussehen (Es tut mir leid, ich kann nicht herausfinden, wie man es zu einem schönen Tisch macht)

date_fixed date_broken average_temperature 
2015-03-16  2015-03-18 11 
2015-03-19 2015-03-22 11,3 

Vielen Dank im Voraus!

Antwort

0

Eine andere mögliche Lösung mit lubridate und %within%

library(lubridate) 
ds$average_Temp <- sapply(interval(ds$date_fixed, ds$date_broken), function(i) 
           mean(weather$temperature[weather$date %within% i])) 
ds 
# date_fixed date_broken average_Temp 
#1 2015-03-16 2015-03-18  11.00000 
#2 2015-03-19 2015-03-22  11.33333 

Hinweis: I umgewandelt temp numerisch wie folgt:

weather$temperature <- as.numeric(as.character(weather$temperature)) 
+0

Danke! Jetzt habe ich auch andere Spalten, die ich nicht in dem oben genannten Beispiel zur Verfügung gestellt habe. Diese Spalten enthalten Informationen zu den Standorten in 'ds' und 'weather'. Ich möchte den avg_temp nur berechnen, wenn diese Standorte genau gleich sind, ist es möglich, eine solche Bedingung zu Ihrer Lösung hinzuzufügen? Danke :) – Mini

+0

Hallo @Nena. Sie müssen eine Aggregation (group_by Art der Sache) machen.Wenn Sie mir Daten zur Verfügung stellen, werde ich meine Lösung aktualisieren. – Sotos

+0

ds <- data.frame (datum_fixed = c ("16-3-2015", "19-3-2015", "21-3-2015"), date_broken = c ("18-3-2015", (22-3-2015, 24-3-2015), Ort = c (A, B, B), Position = c (1, 2, 2))) -AND- wetter <- data.frame (datum = c ("16-3-2015", "17-3-2015", "18-3-2015", "19-3-2015" , "20-3-2015", "21-3-2015", "22-3-2015", "23-3-2015", "24-3-2015"), Temperatur = c ("10" , 11, 12, 11, 12, 11, 13, 14, 12), location = c (A, B, B) , position = c ("1", "2", "2")) – Mini

0

Wir können foverlaps von data.table verwenden. Wandle die 'ds' und 'ds2' data.frame in data.table um und setze den Schlüssel als 'date_fixed' und 'date_broken'. Dann wenden Sie foverlaps auf die 'data.tables, erhalten Sie die mean von' Temperatur ', gruppiert nach' date_fixed 'und' date_broken '.

library(data.table) 
ds2 <- data.frame(date_fixed=weather$date, 
     date_broken = weather$date, temperature = weather$temperature) 

setDT(ds2, key = c("date_fixed", "date_broken")) 
setDT(ds, key = c("date_fixed", "date_broken")) 

foverlaps(ds2, ds)[, .(avg_temp = mean(as.numeric(as.character(temperature)))) , 
      by = .(date_fixed, date_broken)] 
# date_fixed date_broken avg_temp 
#1: 2015-03-16 2015-03-18 11.00000 
#2: 2015-03-19 2015-03-22 11.33333 

HINWEIS: Die ‚Temperatur‘ Säule war factor, so muss es numeric für die Berechnung des durchschnittlichen umgewandelt werden.


Oder mit base R

ds$avg_temp <- unlist(Map(function(x,y) with(weather, 
     mean(as.numeric(as.character(temperature[date >=x & date <= y])))) , 
     ds$date_fixed, ds$date_broken)) 

NOTE2: Obwohl wir > dies tun können, ist es besser, zum Aufkleben mit foverlaps

0

I stringsAsFactors = FALSE in Ihrem Wetter verwendet haben data.frame definition

ds$average_temperature= apply(ds, 1, function(x) mean(as.numeric(weather[weather$date >= x[1] & weather$date <= x[2],2]))) 
3

Mit dem kürzlich implementiert non-equi verbindet Funktion in der current development version von data.table, v1.9.7, kann dies geschehen als folgt:

require(data.table) #v1.9.7 
setDT(weather)[ds, mean(temperature), on=.(date>=date_fixed, date<=date_broken), by=.EACHI] 
#   date  date  V1 
# 1: 2015-03-16 2015-03-18 11.00000 
# 2: 2015-03-19 2015-03-22 11.33333 

Dies ist temperature i s numerischer/Integer-Typ (im Gegensatz zu factor in Ihrer Frage).