Создание многогрупповых гистограмм бок о бок в R - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь воспроизвести эти гистограммы исследования в R.

У меня есть огромный набор данных из этого исследования, поэтому я не думаю, что смогу вставить он здесь, но вот его краткая версия:

menutype menuselection belieflearn learned
5              1           0          0
11             1           1          0
2              3           0          0
2              3           0          0
2              1           0          0
2              1           0          0
10             1           0          0
12             3           0          0
8              3           0          1
12             3           0          0

Идея следующая: сначала я выбираю только те переменные, где указана переменная «menuselection == 3». Затем для этих переменных для каждого значения menutype (в диапазоне 1: 7), которое соответствует соответственно "GUILT", "SSB0" ... на графике, я вычисляю частоту в зависимости от того, ожидал ли игрок вариант 1 (так, если belieflearn == 1) и частота, если игрок выбрал вариант 1 (так, если learned == 1).

Я думаю, что factor() нужно использовать здесь, но я не совсем gr asp как. Я следил за этой веткой и пробовал это:

df2 <- data.frame(
  menutype =  factor(df$menutype, labels = c("GUILT", "SSB0", "SSB1", "FLEX0", "FLEX1", "STD", "FLEX01", "test1","test2", "test3", "test4", "test5" )),
  Belief = factor(df$belieflearn, labels= c("Believe not learn", "Believe Learn")),
  Choice = factor(df$learned, labels= c("Not learn", "Learn"))
)


df3 <- df2 %>%
  count(Belief, menutype) %>%
  group_by(Belief) %>% 
  mutate(prop = n / sum(n))


ggplot(data = df3, aes(menutype, prop , fill = Belief)) +  
  geom_bar(stat = "identity", position = "dodge")

Что работает, но я хочу исключить значения, для которых menutype> 7 (я поставил test1, test2, чтобы получить factor() работает но оптимально, хочу от них избавиться). Я пробовал exclude (), но безуспешно.

Я тоже не указал для menuselection == 3. Может, al oop должен это сделать?

Я получаю это в виде графика. Очевидно, я что-то делаю не так, потому что у меня должно быть две полосы для каждого типа меню с пропорциями Belief и learned.

Кроме того, я новичок в R (и StackOverflow) поэтому, если есть что-то, что я должен добавить в эту ветку, скажите мне!

Спасибо за помощь.

EDIT : Я нашел код Stata, используемый для генерации график в исходном исследовании, вот он:

  graph bar (mean) belieflearn learned if menuselection==3, over(menutype, relabel(1 "{it:{stSerif:GUILT}}" 2 "{it:{stSerif:SSB_{subscript:0}}}" 3 "{it:{stSerif:SSB_{subscript:1}}}" 4 "{it:{stSerif:FLEX_{subscript:0}}}" 5 "{it:{stSerif:FLEX_{subscript:1}}}" 6 "{it:{stSerif:STD_{subscript:0}}}" 7 "{it:{stSerif:FLEX_{subscript:0v1}}}" ))  ///
ytitle("fraction of subjects") yvaroptions(relabel(1 "expected Option 1 (reading)" 2 "chose Option 1 (reading)")) title("classification based on rank ordering") ///
bar(1, bcolor(navy)) bar(2, bcolor(red*0.4) lcolor(red*0.9))  ///
ylab(0(0.2)1, nogrid) blabel(bar, position(outside) format(%9.2f)) graphregion(color(white)) saving(f1, replace) nodraw

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Если я понял ваш вопрос, это может быть то, что вам нужно

ggplot(data = df3, 
aes(interaction(menutype,Belief),  #get combination of groups
prop , fill = Belief) + 
geom_bar(stat = "identity", position = "dodge")+
scale_x_discrete(labels = levels(df3$menutype)) # adds clean label to x
0 голосов
/ 09 мая 2020

Создание поддельных данных:

set.seed(101)
df <- data.frame("menutype" = rep(c("GUILT", "SSB0", "SSB1", "FLEX0", "FLEX1", "STD", "FLEX01", "test1","test2", "test3", "test4", "test5"), each = 2), 
                 "value" = sample(c(2:10), 24, replace = TRUE),
                 "group" = rep(c("Not learn", "Learn"), times = 12))

Создание графика:

library(ggplot2)
ggplot(df, aes(menutype, value))+
  geom_bar(aes(fill = group, color = group), stat = "identity", position = position_dodge(0.8), width = 0.7 )+
  scale_fill_brewer(palette = "Set1")+
  theme_classic()

Результат:

enter image description here

По сути, вам нужны 3 переменные:

  1. ваш value (ось y)
  2. ваш menutype (ось x)
  3. Цветовая переменная group
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...