ayo*_*rgo 2 r bar-chart ggplot2 dplyr
数据集
gender <- c('Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Female', 'Female', 'Male', 'Female', 'Female', 'Male', 'Female', 'Female')
answer <- c('Yes', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'No', 'No', 'No', 'No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes')
df <- data.frame(gender, answer)
Run Code Online (Sandbox Code Playgroud)
对女性有偏见:
df %>% ggplot(aes(gender, fill = gender)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)
我的任务是构建一个图表,以便轻松找出两种性别中哪一种更有可能说出来'Yes'。
但是,考虑到偏见,我不能只是这样做
df %>% ggplot(aes(x = answer, fill = gender)) + geom_bar(position = 'dodge')
Run Code Online (Sandbox Code Playgroud)
甚至
df %>% ggplot(aes(x = answer, y = ..count../sum(..count..), fill = gender)) +
geom_bar(position = 'dodge')
Run Code Online (Sandbox Code Playgroud)
为了减轻偏差,我需要将每个计数分别除以男性或女性总数,以便条形图'Female'加起来1与'Male'条形图一样。就像这样:
df.total <- df %>% count(gender)
male.total <- (df.total %>% filter(gender == 'Male'))$n
female.total <- (df.total %>% filter(gender == 'Female'))$n
df %>% count(answer, gender) %>%
mutate(freq = n/if_else(gender == 'Male', male.total, female.total)) %>%
ggplot(aes(x = answer, y = freq, fill = gender)) +
geom_bar(stat="identity", position = 'dodge')
Run Code Online (Sandbox Code Playgroud)
这描绘了一幅完全不同的画面。
问题:
dplyr有没有办法仅使用and来简化前一段代码ggplot2?谢谢。
问题一:
df %>%
count(gender, answer) %>%
group_by(gender) %>%
mutate(freq = n/sum(n)) %>%
ggplot(aes(x = answer, y = freq, fill = gender)) +
geom_bar(stat="identity", position = 'dodge')
Run Code Online (Sandbox Code Playgroud)
问题2:
您可能可以使用其他包以更少的行数完成此操作。
问题3:
相对频率条形图。