R 中均值的分组条形图

Ard*_*dyn 4 r bar-chart

我有一个数据集(学习者),其中包含学生测试成绩(学习者$literacy_total)、他们的年级(即1、2、3、...、12年级)和他们的性别(学习者$性别)。我想创建一个条形图,其中 x 轴上有成绩,y 轴上有平均分数,每个成绩有两列(一列用于男性,一列用于女性),这样我可以看到男孩/女孩的表现在每个年级。我可以使用以下代码轻松创建每个年级的总体平均值图:

fig.dist <- split(learner$literacy_total, learner$learner_grade)
fig.mean <- sapply(fig.dist, mean, na.rm = TRUE)
barplot(fig.mean)
Run Code Online (Sandbox Code Playgroud)

但是我如何将这些分组,以便对于每个年级,我可以分别看到男孩/女孩的平均测试成绩。

在其他问题中,我看到过对类别进行分组或用图表表示平均值的代码,但我正在努力解决如何将两者放在一起的问题。

Par*_*ait 5

为了扩展@detroyejr的答案,请考虑tapply按各种因子对向量进行切片,并应用一个函数,例如mean返回指定向量或矩阵的每个子集。

但是,为了与原始整体平均条形图保持一致,请将tapply结果转置t()为男性/女性rownames和 1-12 年级作为colnames。然后用于beside=TRUE未堆叠的条形图。

gender.mean <- t(tapply(learner$literacy_total,
                        list(learner$learner_grade, learner$gender), mean))

barplot(gender.mean, col=c("darkblue","red"), beside=TRUE, legend=rownames(gender.mean))
Run Code Online (Sandbox Code Playgroud)

用随机数据进行演示:

set.seed(888)
learner <- data.frame(
  learner_grade = replicate(50, sample(seq(12), 1, replace=TRUE)),
  gender = replicate(50, sample(c("MALE", "FEMALE"), 1, replace=TRUE)),
  literacy_total = abs(rnorm(50)*100)
)

gender.mean <- t(tapply(learner$literacy_total, 
                        list(learner$learner_grade, learner$gender), mean))

barplot(gender.mean, col=c("darkblue","red"), beside=TRUE, legend=rownames(gender.mean))
Run Code Online (Sandbox Code Playgroud)

条形图输出