2016-10-21 2 views
1

У меня есть следующий кадр данных и этот вопрос относится к этой теме []Как рассчитать среднее время для агрегированных данных для разных групп?

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") 

Я хочу, чтобы получить среднее время ожидания для обслуживаемых и nonserviced групп. Это как сгруппировали данные:

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][] 

Однако avg_wt = mean(waiting_time)) оценкам среднее время ожидания над Total. Мне бы скорее понадобилось avg_wt_serviced и avg_wt_notserviced.

Результат должен быть:

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

@RonakShah: Вы абсолютно правы. Спасибо, что заметили. 10 относится к 2012 году и ВВВ. В случае 2012 года и AAA это 0. – FiofanS

ответ

2

С dplyr, мы можем использовать 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

Отлично! Спасибо. – FiofanS

0

Проблема, кажется, лежат в приведенных колонках. Редактировать/Добавлено: Из-за котировок colummn считывается как фактор-переменная. См. class(df$waiting_time)

Добавление этой строки перед вычислением дает правильный ответ для меня.

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

Извините, я не уверен, как это связано с вопросом? Я спрашиваю, как создать два столбца 'avg_wt_serviced' и' avg_wt_notserviced', используя 'data.table' – FiofanS

+0

OK. Это давало мне нечетные средние значения как с data.table, так и с dplyr, поэтому я подумал, что это проблема (что эта проблема решена). Посмотрите на разделение его на широкий формат сейчас –

2

здесь это: В вашем dataframe, время ожидания должно быть число быть в состоянии использовать mean см as.numeric(), чтобы преобразовать его.

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][] 
Смежные вопросы