Подтвердить что ты не робот

Как получить панель с несколькими переменными рядом друг с другом, сгруппированными по фактору

У меня есть набор данных, который выглядит следующим образом. Я пытаюсь сделать 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

какие-либо предложения, как это сделать? Я сделал несколько поисков, но я нахожу только примеры факторов на оси х, а не переменные, сгруппированные по фактору. любая помощь будет оценена!

4b9b3361

Ответ 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