2013-02-27 99 views
1

已知以下數據:barplot每個類別的百分比,每個變量

df<-data.frame(cbind(cntry<- c("BE","ES","IN","GE","BE","ES","GE",NA,"IN","IN"), 
gndr<- c(NA,1,2,2,2,2,1,1,1,2), 
plcvcrcR<-c(0,1,NA,0,0,1,1,1,0,0), 
plcpvcrR<-c(0,1,1,1,NA,0,0,0,0,0), 
plccbrgR<- c(0,1,0,NA,0,1,0,1,1,0), 
plcarcrR<-c(1,0,0,NA,1,0,1,0,0,0), 
plcrspcR<-c(1,1,0,0,0,0,0,1,1,NA))) 
colnames(df)<- c("cntry", "gndr", "plcvcrcR", "plcpvcrR", "plccbrgR", "plcarcrR", "plcrspcR") 
df 

我如何才能讓barplots顯示例如每個性別(gndr)的1-values的變量plcpvcrRplccbrgR百分比,plcarcrR ?優選地,針對每個性別的條被分組,並且針對不同的變量具有不同的顏色。

像這樣的圖像,其中一個顏色指的問題,並且該組的性別(不置信區間):

https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcSsAlUJsqdhxXHiY35FxFmVx3BREVji_ca24w9ub_OYEfZ3O50X5Q

我已經嘗試用下面的函數,其中我我知道它包含了許多缺陷:

barplot(((colSums(df[c(3:5)], na.rm=TRUE)/nrow(df[c(3:5)]))*100)~gndr) 
+1

你想如何處理'NA'? – Arun 2013-02-27 17:47:11

+0

我想僅以有效百分比來計算它(即,從總數中省略「NA」)。 – Marloes 2013-02-27 17:51:44

+1

性別如何?你想繪製'1,2和NA'嗎?當你的意思是從總數中排除NA時,你的意思是除以總數時,不應該包括NA? – Arun 2013-02-27 18:06:21

回答

3

我會做這樣的事情:

require(ggplot2) 
require(reshape2) 
require(scales) 
require(plyr) 

# remove NA from gndr 
df <- df[!is.na(df$gndr), ] 
# now get percentages 
df.o <- ddply(df, .(gndr), summarise, 
       plcpvcrR = sum(plcpvcrR == 1, na.rm = T)/sum(!is.na(plcpvcrR)), 
       plccbrgR = sum(plccbrgR == 1, na.rm = T)/sum(!is.na(plccbrgR)), 
       plcrspcR = sum(plcrspcR == 1, na.rm = T)/sum(!is.na(plcrspcR))) 
# melt it: 
df.m <- melt(df.o, id.var = "gndr") 

# plot it: 
ggplot(data = df.m, aes(x=gndr)) + geom_bar(aes(weights=value, fill=variable), 
     position = "dodge") + scale_y_continuous(labels=percent) 

可能有更簡單/直接的方法來獲得百分比。這裏的情節:

enter image description here