使用数据集

时间:2017-11-16 19:23:58

标签: r variables dataframe

我正在处理为每个教室创建一个男女学生平均得分差异的变量。班级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

有什么想法吗?

谢谢!

1 个答案:

答案 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]))

避免重塑。