2016-10-21 5 views
1

は、私は、次のデータフレームを持っており、この質問には、[このスレッド]私はサービスとnonservicedグループの平均待ち時間を取得したい異なるグループごとの集計データの平均時間を計算するにはどうすればよいですか?

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 = mean(waiting_time)), ## THE PROBLEM HERE!!! 
    .(year, type)][, Total := num_serviced + num_notserviced][] 

ただし、avg_wt = mean(waiting_time))合計平均待機時間の見積もり。むしろavg_wt_servicedavg_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年とBBBを指す。 2012年およびAAAの場合は0です。 – FiofanS

答えて

2

、我々は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

問題が引用された列にあるように見えます。 編集/追加されました:引用符のため、列変数が変数として読み込まれています。 class(df$waiting_time)

計算前にこの行を追加すると、正しい答えが得られます。 dplyr

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

申し訳ありませんが、これがどのように質問に関連しているかわかりません。 'data.table' – FiofanS

+0

を使って' avg_wt_serviced'と 'avg_wt_notserviced'の2つのカラムを作成する方法を尋ねています。私にはdata.tableとdplyrの両方で奇妙な平均値が与えられていたので、それが問題だったと思った(この問題は解決した)。これをワイドフォーマットに分割することになります。 –

2

を使用することができ、ここにある:あなたのデータフレームで 、待機時間は、それを変換するas.numeric()を参照して、数がmeanを使用することができなければなりません。

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][] 
関連する問題