r的均值图表

发布于 2025-01-23 15:18:33 字数 452 浏览 3 评论 0原文

我有一个具有学生考试成绩(学习者$ linacy_total)的数据集(学习者),他们的年级水平(即1年级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)

但是如何对这些代码进行分组,以便每个年级可以单独看到男孩/女孩的平均考试成绩。

在其他问题中,我看到的代码要么将类别分组或绘制手段,但是我正在努力将两者放在一起。

I have a data set (learner) with student test scores (learner$literacy_total), their grade level (ie. grade 1, 2, 3, ..., 12), and their gender (learner$gender). I'd like to create a bar plot that has grade on the x axis, and the average score on the y axis, with two columns for each grade (one for males and one for females) so I can see how boys/girls do in each grade. I can easily create a plot of the overall average for each grade using the following code:

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

But how do I group these so that for each grade I can see the average test scores for boys/girls separately.

In other questions I've seen code that either groups categories or graphs the means, but I'm struggling with how to put the two together.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

高跟鞋的旋律 2025-01-30 15:18:33

要扩展 @detroyejr的答案,请考虑tapply将向量切成各种因子,并将诸如sean之类的函数应用于每个子集返回返回命名向量或矩阵的每个子集。

但是,要与您的原始总体平均值小号保持一致,请将tapplyt()用于男性/女性/女性 Rownames 和1-12等级如 colnames 。然后使用base = 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))

“

To extend @detroyejr's answer, consider tapply which slices a vector by various factor(s) and applies a function such as mean to each subset returning a named vector or matrix.

However, to align to your original overall mean barplot, transpose the tapply result with t() for male/female rownames and 1-12 grades as colnames. Then use beside=TRUE for unstacked bars.

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

To demonstrate with random data:

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

Bar Plot Output

遗忘曾经 2025-01-30 15:18:33

您可以使用tapply(请参阅在这里帮助(tapply)以获取更多信息)。因此,使用您的数据集这样的东西:

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

在此示例中,tapply本质上破坏linacy_total中的每种组合learner_gradegender可用并计算每个分组的平均值。您可以使用另一个示例看到:

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

如果提供可重复的示例,则更容易回答,但这可能会使您开始。

You can use tapply (see here or help(tapply) for more info). So, something like this using your dataset:

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

In this example, tapply essentially breaks literacy_total into each combination of learner_grade and gender available and computes the mean value at each grouping. You can see another example using:

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

It's easier to answer if you provide a reproducible example, but this might get you started.

暮年慕年 2025-01-30 15:18:33

使用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")

“在此处输入图像描述”

a solution using ggplot and dplyr

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

enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文