2016-05-17 15 views
1

Ich möchte die durchschnittliche Brennstunden (Brennstunden $ Stunden_burned) für den Zeitraum zwischen DS $ date_fixed und ds $ date_broken berechnen. Ich weiß, ich kann dies berechnen, indem Sie den Code unten verwenden:Berechnen Durchschnitt einer Zeit (aus einem anderen Dataset) pro Standort in r

ds$average_burninghours <- sapply (interval(ds$date_fixed, ds$date_broken), function(i)         
          mean (burning_hours$hours_burned[burning_hours$date%within%i])) 

aber ich mag die burning_hours berechnen auf der Lage und Position abhängig. Also, ich möchte eine Art Code hinzufügen, der lke sucht: 'group_by = c (location, position)', aber das schaffe ich nicht. Hat jemand Ideen dazu?

Beispielcode:

ds <- data.frame(date_fixed= c("16-3-2015", "19-3-2015", "21-3-2015"), 
        date_broken = c("18-3-2015", "22-3-2015", "24-3-2015"), 
        location = c("A", "B", "B"), position = c("1", "2", "2")) 

burning_hours <- data.frame(date = c("16-3-2015", "16-3-2015", "17-3-2015", "17-3-2015", 
          "18-3-2015", "18-3-2015", "19-3-2015", "19-3-2015", "20-3-2015", 
          "20-3-2015", "21-3-2015", "21-3-2015", "22-3-2015", "22-3-2015", 
          "23-3-2015", "23-3-2015", "24-3-2015", "24-3-2015"), 
          hours_burned= c("10", "11"), location = c("A", "B"), 
          position = c("1", "2")) 

Gewünschtes Ergebnis:

 date_fixed date_broken location position avg_burninghours 
    16-3-2015 18-3-2015 A   1   10 
    19-3-2015 22-3-2015 B   2   11 
    21-3-2015 24-3-2015 B   2   11 

Antwort

0

Zusammenführen der beiden Datenrahmen, und dann Untergruppe.

library(dplyr) 
library(lubridate) 

#Cleaning 
ds$date_fixed <- dmy(ds$date_fixed) 
ds$date_broken <- dmy(ds$date_broken) 
burning_hours$date <- dmy(burning_hours$date) 
burning_hours$hours_burned <- as.numeric(as.character(burning_hours$hours_burned)) 

df <- merge(burning_hours,ds,by = c('location','position')) 

df %>% 
    group_by(date_fixed,date_broken,location,position) %>% 
    filter(date >= date_fixed,date <= date_broken) %>% 
    summarise(avg_burninghours = mean(hours_burned)) 

Welche gibt:

date_fixed date_broken location position avg_burninghours 
     (date)  (date) (fctr) (fctr)   (dbl) 
1 2015-03-16 2015-03-18  A  1    10 
2 2015-03-19 2015-03-22  B  2    11 
3 2015-03-21 2015-03-24  B  2    11 
+0

Wenn ich diesen Code auf den gesamten Datensatz ausführen ich habe, habe ich nur ein Ergebnis für ‚avg_burninghours‘. Es macht keine neue Spalte in df. Hast du eine Idee, woher das kommt? – Mini

+0

Haben Sie den Reinigungscode vor der Zusammenführung und Teilmenge ausgeführt? Können Sie das 'str' des Datasets an dem Punkt teilen, der kurz vor dem Ausführen der Zusammenführungs- und Teilmengenoperation liegt? Falsche Datentypen in Ihren Daten verhindern möglicherweise, dass Sie sie manipulieren. – shreyasgm