我正在处理为每个教室创建一个男女学生平均得分差异的变量。班级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
有什么想法吗?
谢谢!
答案 0 :(得分:1)
这是一个使用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]))
避免重塑。