【问题标题】:Grouped Bar Chart of Means in RR中均值的分组条形图
【发布时间】:2018-02-15 19:04:33
【问题描述】:

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

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

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

在其他问题中,我看到了对类别进行分组或以图表表示均值的代码,但我正在为如何将两者放在一起而苦苦挣扎。

【问题讨论】:

    标签: r bar-chart


    【解决方案1】:

    要扩展@detroyejr 的答案,请考虑tapply,它按各种因素对向量进行切片,并将mean 等函数应用于返回命名向量或矩阵的每个子集。

    但是,为了与您的原始整体平均条形图保持一致,请将 tapply 结果转置为男性/女性行名和 1-12 级作为 列名t() .然后将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))
    

    用随机数据演示:

    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))
    

    【讨论】:

    • 这很有帮助,而且效果很好!非常感谢。
    【解决方案2】:

    使用ggplotdplyr 的解决方案

    library(ggplot2)
    library(dplyr)
    # example data (make sure 'sex' and 'grade' is stored as a factor)
    df <- data.frame(literacy_total = rnorm(300)^2, 
                 grade = as.factor(rep(1:10, 30)),
                 sex = as.factor(sample(1:2, 300, replace = TRUE)))
    
    # calculate the means of each combination of 'grade' and 'sex' with `group_by`
    means <- df %>% group_by(grade, sex) %>% 
       summarise(mean = mean(literacy_total))
    
    # making the plot
    ggplot(means, aes(x = grade, y = mean, fill = sex)) +
        geom_bar(stat = "identity", position = "dodge")
    

    【讨论】:

      【解决方案3】:

      您可以使用tapply(有关详细信息,请参阅herehelp(tapply))。所以,使用你的数据集是这样的:

      tapply(df[["literacy_total"]], list(df[["learner_grade"]], df[["gender"]]), mean)
      

      在此示例中,tapply 实质上将literacy_total 分解为learner_gradegender 可用的每个组合,并计算每个分组的平均值。您可以使用以下方法查看另一个示例:

      tapply(mtcars$mpg, list(mtcars$cyl, mtcars$am), mean)
      

      如果您提供可重现的示例,则更容易回答,但这可能会让您入门。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 2017-01-02
        • 2020-12-20
        • 1970-01-01
        • 2020-05-12
        • 2016-07-11
        • 1970-01-01
        相关资源
        最近更新 更多