我想用變數 Q1 到 Q5的平均值顯示年份和性別的不同條形圖,它應該看起來像一個密度。
我的資料如下所示:
data <- data.frame(userid = c(1,1,1,2,2,2,3,3,3),
year = c(2013,2014,2015,2013,2014,2015,2013,2014,2015),
gender = c(1,1,1,0,0,0,0,0,0),
Q1 = c(3,2,3,1,0,1,2,1,0),
Q2 = c(4,3,4,2,0,2,1,4,3),
Q3 = c(1,2,1,3,5,4,5,4,5),
Q4 = c(1,2,1,2,4,3,2,2,1),
Q5 = c(1,1,1,2,1,0,0,0,1))
我的解決方案是先filter()獲取年份和性別,然后使用summarise(), 來獲取均值向量并將其放入barplot()函式中:
data %>% filter(gender==1,year==2013) %>% select(-userid,-gender,-year) %>% summarise_all(mean) %>%
as.numeric() %>%
barplot()
除了對年份和性別的每個組合都這樣做之外,還有更優雅的方法,使用 ggplot 和facet_wrap()?
uj5u.com熱心網友回復:
我可能誤解了您希望如何安排情節,但如果您想顯示每年和性別組的平均分數答案,您可以這樣做:
library(tidyverse)
data %>%
pivot_longer(starts_with("Q")) %>%
group_by(year, gender, name) %>%
summarize(value = mean(value)) %>%
ggplot(aes(name, value))
geom_col(fill = 'deepskyblue4')
facet_grid(year ~ gender)
labs(x = 'Question', y = 'Average score')
theme_minimal(base_size = 16)

uj5u.com熱心網友回復:
也許你想要這樣的東西facet_wrap,geom_col平均值是這樣計算的rowMeans:
library(dplyr)
library(ggplot2)
data %>%
mutate(mean = rowMeans(select(., starts_with("Q")), na.rm = TRUE)) %>%
ggplot(aes(x = year, y = mean, fill = factor(gender)))
geom_col()
labs(x = 'Year', y = 'Mean Q1 to Q5', fill = 'Gender')
theme_bw()
facet_wrap(~userid)


uj5u.com熱心網友回復:
aggregate然后barplot。
par(mfrow=c(1, 4))
sapply(unique(data$year), \(x) {
as.matrix(aggregate(cbind(Q1, Q2, Q3, Q4, Q5) ~ gender, data[data$year == x, ], FUN=mean)[-1]) |>
barplot(beside=TRUE, col=c(2, 4), main=x)
})
plot.new()
legend('left', legend=c('m', 'f'), col=c(2, 4), cex=1.2, pch=15, bty='n')

uj5u.com熱心網友回復:
這種方法不需要您首先計算均值,由stat_summary()指定處理fun = mean。
library(tidyverse)
data <- data.frame(userid = c(1,1,1,2,2,2,3,3,3),
year = c(2013,2014,2015,2013,2014,2015,2013,2014,2015),
gender = c(1,1,1,0,0,0,0,0,0),
Q1 = c(3,2,3,1,0,1,2,1,0),
Q2 = c(4,3,4,2,0,2,1,4,3),
Q3 = c(1,2,1,3,5,4,5,4,5),
Q4 = c(1,2,1,2,4,3,2,2,1),
Q5 = c(1,1,1,2,1,0,0,0,1))
data %>%
select(starts_with("Q")) %>% # Selects each column that starts with "Q"
pivot_longer(cols = everything()) %>% # Pivot to long format
ggplot(aes(x = name, y = value, fill = name))
stat_summary(geom = "bar", fun = "mean") # Geom and function can be changed easily
theme_classic()
labs(x = "Q", y = "Mean value", fill = NULL)

由reprex 包于 2022-10-28 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522766.html
