我有以下表格的数据:
mydata <- data.frame(test = 1:20, group = sample(c("A", "B"), 20, rep=TRUE), var1 = sample(c("yes", "no", "NA"), 20, rep=TRUE), var2 = sample(c("yes", "no", "NA"), 20, rep=TRUE), var3 = sample(c("yes", "no", "NA"), 20, rep=TRUE), var4 = sample(c("yes", "no", "NA"), 20, rep=TRUE), var5 = sample(c("yes", "no", "NA"), 20, rep=TRUE))
我想制作一个条形图,其中A组和B组的观察次数(频率计数)与0&#34;是&#34;条目,1&#34;是&#34;进入,2&#34;是&#34;条目一直到所有5个变量为#34;是&#34;。最终结果将是一个条形图,其中X轴显示所有可能的数字&#34;是&#34;条目(0,1,2,3,4,5),Y轴显示每个X值的计数频率和组A和B的单独条。每个组的频率计数(条形高度)是具有给定数量&#34;是&#34;的行数。条目。缺失数据(NA)计为&#34;否&#34;。看了看其他帖子,仍然不太清楚如何写这个,思想赞赏。
答案 0 :(得分:3)
尝试
library(ggplot2)
library(dplyr)
library(tidyr)
f1 <- function(x) sum(x=='yes')
mydata %>%
group_by(group) %>%
summarise_each(funs(f1), var1:var5) %>%
gather(Var, Val, var1:var5)%>%
ggplot(., aes(x=Var, y=Val, fill=group))+
geom_bar(stat="identity", position='dodge')
基于对@ Math的帖子的评论,也许这有助于
df1 <- gather(mydata, Var, Val, var1:var5) %>%
group_by(group, test) %>%
summarise(Val=sum(Val=='yes')) %>%
group_by(group, Val) %>%
summarise(n=n())
left_join(expand.grid(group=unique(df1$group),
Val= unique(df1$Val)), df1) %>%
mutate(n=replace(n, is.na(n), 0))%>%
ggplot(., aes(x=Val, y=n, fill=group))+
geom_bar(stat='identity', position='dodge')
答案 1 :(得分:2)
barplot
函数接受矩阵作为参数,并根据列对条形图进行分组。
您可以使用列上的apply
生成所需的矩阵(第二个参数== 2),然后使用barplot
绘图:
res=apply(as.matrix(mydata[,3:ncol(mydata)]), 2, function(cc) { return(c(sum(mydata$group=="A" & cc=="yes"), sum(mydata$group=="B" & cc=="yes"))) })
barplot(res, beside=T)
修改强> 要按行应用,想法是一样的,你想为条形图生成一个矩阵。
mydata$count = apply(as.matrix(mydata[3:ncol(mydata)]), 1,
function(cc) { return(sum(cc=="yes")) })
barmat = c()
for (ii in 1:range(mydata$count)[2]) {
barmat = cbind(barmat, c(sum(mydata$group=="A" & mydata$count==ii),sum(mydata$group=="B" & mydata$count==ii) ))
}
colnames(barmat) = 1:range(mydata$count)[2]
barplot(barmat, beside=T)