2016-10-21 2 views
1

Ich habe folgende Datenrahmen und diese Frage bezieht sich auf [diesen Thread]Wie berechnet man die durchschnittliche Zeit für aggregierte Daten für verschiedene Gruppen?

df = data.frame(c("2012","2012","2012","2013"), 
       c("AAA","BBB","AAA","AAA"), 
       c("X","Not-serviced","X","Y"), 
       c("2","10","3","2.5")) 

colnames(df) = c("year","type","service_type","waiting_time") 

Ich durchschnittliche Wartezeiten für Service und nonserviced Gruppen erhalten möchten. Dies ist, wie die Daten gruppiert sind:

library(data.table) 
setDT(df)[, .(num_serviced = sum(service_type != "Not-serviced"), 
     num_notserviced = sum(service_type =="Not_serviced"), 
     avg_wt = mean(waiting_time)), ## THE PROBLEM HERE!!! 
    .(year, type)][, Total := num_serviced + num_notserviced][] 

jedoch avg_wt = mean(waiting_time)) durchschnittliche Wartezeit über insgesamt geschätzt. Ich würde eher avg_wt_serviced und avg_wt_notserviced benötigen.

muss das Ergebnis sein:

year type num_serviced num_notserviced num_total avg_wt_serviced avg_wt_notserviced 
2012 AAA 2   0    2   2.5    0 
+1

@RonakShah: Sie haben absolut Recht. Danke fürs bemerken. 10 bezieht sich auf 2012 und BBB. Im Falle von 2012 und AAA ist es 0. – FiofanS

Antwort

2

Mit dplyr können wir mean

library(dplyr) 
df %>% 
    group_by(year,type) %>% 
    summarise(num_serviced = sum(service_type != "Not-serviced"), 
      num_notserviced = sum(service_type == "Not-serviced"), 
      num_total = num_serviced + num_notserviced, 
      avg_wt_serv = mean(waiting_time[service_type != "Not-serviced"]), 
      avg_wt_notser = mean(waiting_time[service_type == "Not-serviced"])) 


# year type num_serviced num_notserviced num_total avg_wt_serv avg_wt_notser 
# <fctr> <fctr> <int>   <int>  <int>  <dbl>   <dbl> 
#1 2012 AAA  2    0   2  2.5   NaN 
#2 2012 BBB  0    1   1  NaN   10 
#3 2013 AAA  1    0   1  2.5   NaN 
+1

Großartig! Vielen Dank. – FiofanS

0

Das Problem in den genannten Spalten zu liegen scheinen. Bearbeiten/Hinzugefügt: Aufgrund von Anführungszeichen wird die Spalte als Faktorvariable gelesen. Siehe class(df$waiting_time)

Das Hinzufügen dieser Zeile vor der Berechnung gibt die richtige Antwort für mich.

df$waiting_time<- as.numeric(as.character(df$waiting_time)) 
+0

Sorry, ich bin mir nicht sicher, wie das mit der Frage zusammenhängt? Ich frage, wie man zwei Spalten 'avg_wt_serviced' und' avg_wt_notserviced' mit 'data.table' erstellt – FiofanS

+0

OK. Es gab mir sowohl bei data.table als auch bei dplyr merkwürdige Mittelwerte, also dachte ich, das wäre das Problem (was dieses Ding gelöst hat). Werde es jetzt in das breite Format aufteilen –

2

hier verwenden ist: In Ihrem Datenrahmen muss die Wartezeit eine Zahl sein können mean verwenden, finden Sie as.numeric() es zu konvertieren.

df = data.frame(c("2012","2012","2012","2013"), 
       c("AAA","BBB","AAA","AAA"), 
       c("X","Not-serviced","X","Y"), 
       c(2,10,3,2.5)) 

colnames(df) = c("year","type","service_type","waiting_time") 

library(data.table) 
setDT(df)[, .(num_serviced = sum(service_type != "Not-serviced"), 
       num_notserviced = sum(service_type =="Not-serviced"), 
       avg_wt_serviced = ifelse(service_type != "Not-serviced",mean(waiting_time),0), 
       avg_wt_notserviced = ifelse(service_type == "Not-serviced",mean(waiting_time),0)), 
      .(year, type)][, Total := num_serviced + num_notserviced][] 
Verwandte Themen