我正在处理为每个教室的男女学生之间的平均分数差异创建一个变量。Class id 代表每个教室。性别是针对每个学生的,最后一列是他们的分数。
我希望每个教室都有一个平均差值(女性(1)-男性(0));
我的数据如下所示:
data <- matrix(c(1,1,1,1,2,2,2,2,3,3,3,3,
0,1,1,0,1,0,0,1,0,1,1,0,
20,25,22,21,30,35,32,31,40,45,42,44),
nrow=12,
ncol=3)
colnames(data) <- c("class id","gender","score")
> data
class id gender score
[1,] 1 0 20
[2,] 1 1 25
[3,] 1 1 22
[4,] 1 0 21
[5,] 2 1 30
[6,] 2 0 35
[7,] 2 0 32
[8,] 2 1 31
[9,] 3 0 40
[10,] 3 1 45
[11,] 3 1 42
[12,] 3 0 44
我需要它是这样的:
> data
class id mean score
[1,] 1 3
[2,] 2 -3
[3,] 3 1.5
有什么想法吗?
谢谢!
这是一个使用 tidyverse 函数的解决方案
library(tidyverse)
data %>% as_tibble %>%
group_by(`class id`, gender) %>%
summarize(mean=mean(score)) %>%
spread(gender, mean) %>%
mutate(mean_score=`1`-`0`) %>%
select(`class id`, mean_score)
使用 tibble 或 data.frame 比使用矩阵容易得多,因此您可以从转换输入数据开始。然后我们计算每个性别的平均值。然后我们将其展开以在每个班级的同一记录中为每个性别设置一个值。然后我们只取不同之处。请注意反引号,因为此示例中的列名称为奇数。
或者你可以做这样的事情
data %>% as_tibble %>%
group_by(`class id`) %>%
summarize(mean_score=mean(score[gender==1]) - mean(score[gender==0]))
这避免了重塑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句