Как получить панель с несколькими переменными рядом друг с другом, сгруппированными по фактору
У меня есть набор данных, который выглядит следующим образом. Я пытаюсь сделать barplot с переменным поменю group, со всеми переменными рядом друг с другом по оси x (сгруппированные по полу как наполнители с разными цветами) и средними значениями переменных по оси y (которые в основном представляют проценты)
tea coke beer water gender
14.55 26.50793651 22.53968254 40 1
24.92997199 24.50980392 26.05042017 24.50980393 2
23.03732304 30.63063063 25.41827542 20.91377091 1
225.51781276 24.6064623 24.85501243 50.80645161 1
24.53662842 26.03706973 25.24271845 24.18358341 2
В конце концов, я хочу получить такой барплот
![enter image description here]()
какие-либо предложения, как это сделать? Я сделал несколько поисков, но я нахожу только примеры факторов на оси х, а не переменные, сгруппированные по фактору. любая помощь будет оценена!
Ответы
Ответ 1
Вы можете использовать агрегат для расчета средств:
means<-aggregate(df,by=list(df$gender),mean)
Group.1 tea coke beer water gender
1 1 87.70171 27.24834 24.27099 37.24007 1
2 2 24.73330 25.27344 25.64657 24.34669 2
Избавьтесь от столбца Group.1
means<-means[,2:length(means)]
Затем вы переформатируете данные в длинном формате:
library(reshape2)
means.long<-melt(means,id.vars="gender")
gender variable value
1 1 tea 87.70171
2 2 tea 24.73330
3 1 coke 27.24834
4 2 coke 25.27344
5 1 beer 24.27099
6 2 beer 25.64657
7 1 water 37.24007
8 2 water 24.34669
Наконец, вы можете использовать ggplot2 для создания вашего сюжета:
library(ggplot2)
ggplot(means.long,aes(x=variable,y=value,fill=factor(gender)))+
geom_bar(stat="identity",position="dodge")+
scale_fill_discrete(name="Gender",
breaks=c(1, 2),
labels=c("Male", "Female"))+
xlab("Beverage")+ylab("Mean Percentage")
![enter image description here]()
Ответ 2
Вы можете построить средства без использования внешних вычислений и дополнительных таблиц с помощью stat_summary(...)
. Фактически, stat_summary(...)
был разработан именно для того, что вы делаете.
library(ggplot2)
library(reshape2) # for melt(...)
gg <- melt(df,id="gender") # df is your original table
ggplot(gg, aes(x=variable, y=value, fill=factor(gender))) +
stat_summary(fun.y=mean, geom="bar",position=position_dodge(1)) +
scale_color_discrete("Gender")
stat_summary(fun.ymin=min,fun.ymax=max,geom="errorbar",
color="grey80",position=position_dodge(1), width=.2)
![]()
Чтобы добавить "бары ошибок", вы также используете stat_summary(...)
(здесь я использую значение min и max, а не sd, потому что у вас так мало данных).
ggplot(gg, aes(x=variable, y=value, fill=factor(gender))) +
stat_summary(fun.y=mean, geom="bar",position=position_dodge(1)) +
stat_summary(fun.ymin=min,fun.ymax=max,geom="errorbar",
color="grey40",position=position_dodge(1), width=.2) +
scale_fill_discrete("Gender")
![]()
Ответ 3
Использование reshape2
и dplyr
. Ваши данные:
df <- read.table(text=
"tea coke beer water gender
14.55 26.50793651 22.53968254 40 1
24.92997199 24.50980392 26.05042017 24.50980393 2
23.03732304 30.63063063 25.41827542 20.91377091 1
225.51781276 24.6064623 24.85501243 50.80645161 1
24.53662842 26.03706973 25.24271845 24.18358341 2", header=TRUE)
Получение данных в правильную форму:
library(reshape2)
library(dplyr)
df.melt <- melt(df, id="gender")
bar <- group_by(df.melt, variable, gender)%.%summarise(mean=mean(value))
Черчение:
library(ggplot2)
ggplot(bar, aes(x=variable, y=mean, fill=factor(gender)))+
geom_bar(position="dodge", stat="identity")
![enter image description here]()