ddply()函數位於plyr包,用於對data.frame進行分組統計,與tapply有些類似
准備數據
# 使用stringsAsFactors=F來防止data.frame把向量轉為factor
apache = data.frame(httpCode=c(200,200,200,404,404,500),
time=c(100,111,210,10,10,500),
api=c('index','index','logout','show','show','index'),
stringsAsFactors=F)
統計每個api的請求數
ddply(apache,.(api),summarize,number=length(api))
api number
1 index 3
2 logout 1
3 show 2
統計每個api的各個httpCode的請求數:
a <- ddply(apache,.(api,httpCode),summarize,number=length(api))
api httpCode number
1 index 200 2
2 index 500 1
3 logout 200 1
4 show 404 2
下面這個復雜些,根據上面的統計結果a,統計每個api所占比例
b <- ddply(a,
.(),
.fun=function(x){
transform(x, percentage=with(x,ave(number,api,FUN=sum)/sum(number)))
})
.id api httpCode number percentage
1 <NA> index 200 2 0.333
2 <NA> index 500 1 0.167
3 <NA> logout 200 1 0.167
4 <NA> show 404 2 0.333
這就是說你可以根據需要寫自己的統計函數
用ggplot畫api占比圖
ggplot(b,aes(x=reorder(api,percentage),y=percentage,fill=factor(httpCode))) +
geom_bar() +
scale_y_continuous(labels = percent_format()) +
coord_flip() +