通过R

时间:2019-02-21 14:29:34

标签: r dataframe

我的主要目标:我有一个包含许多学生的数据框,他们在测试中对45个项目的回答,以及对45个项目中每一项的正确答案。一些学生来自同一所学校(我们为每所学校都有一个ID)。

我需要的是在每所学校和每项活动中,正确回答该问题的人数百分比。

我能够分离向量,并为每个学生校正测试,然后我在图片中得到了一个0和1的数据框(每行是一个学生)。

然后,我可以通过以下方式获得问题1所需的内容:

 escolas <- group_by(acertos, School_ID)
 percentual <- summarize(escolas, count = n(), P1 = (sum(Q1)/count)*100)

我可以输入其中的45行,更改问题参考,但我很确定还有另一种方法,但我无法弄清楚。


可重复的示例,有20名学生,4所学校和5项内容:

Student_ID = c(1:20)
School_ID = c(rep(1,5),rep(2,5), rep(3,5), rep(4,5))

Q1 = 1*(runif(20) < 0.5)
Q2 = 1*(runif(20) < 0.5)
Q3 = 1*(runif(20) < 0.5)
Q4 = 1*(runif(20) < 0.5)
Q5 = 1*(runif(20) < 0.5)

data <- tibble(Student_ID, School_ID, Q1, Q2, Q3, Q4, Q5)
data
    Student_ID School_ID    Q1    Q2    Q3    Q4    Q5


           1         1     0     1     1     0     1
           2         1     0     0     1     1     0
           3         1     0     1     0     0     0
           4         1     0     0     0     0     1
           5         1     0     1     1     1     1
           6         2     0     0     1     0     1
           7         2     0     0     1     1     1
           8         2     1     1     1     0     0
           9         2     0     0     1     0     0
          10         2     1     1     1     1     1

我希望是这样的

        School_ID    Q1     Q2   Q3    Q4     Q5


           1         70%   50%   30%   20%   40%   
           2         60%   40%   20%   10%   30%      

含义:

考虑到学校1的所有学生(只有他们),有70%的学生获得了Q1权利。

考虑所有来自学校2的学生(只有他们),有30%的学生认为Q5正确,依此类推。适用于所有学校和所有项目。

我希望这可以使您更轻松地尝试并更好地理解挑战。

1 个答案:

答案 0 :(得分:0)

因此,我尝试按如下所示复制数据框:

N = 200
data <- tibble(
  School_ID = 1:N,
  Q1 = 1*(runif(N) < 0.5),
  Q2 = 1*(runif(N) < 0.5),
  Q3 = 1*(runif(N) < 0.5),
  Q4 = 1*(runif(N) < 0.5),
  Q5 = 1*(runif(N) < 0.5),
)

接下来,您可以使用tidyr或像这样直接导入tidyverse:

# this
library(tidyverse)
# or  this
library(tidyr)

data %>% 
  group_by(School_ID) %>% 
  gather(
    `Question ID`,
    Score,
    -School_ID
  ) %>% 
  group_by(School_ID, `Question ID`) %>% 
  summarise(
    Proportion = mean(Score)
  )

说明:首先,我将矩阵展平,因此在收集行之后,您将获得一个包含三列的表格:School_ID,Question ID和Score。然后,我将学校ID和问题ID分组,然后应用转换。

奖金:您添加了“ spread”语句以再次转置数据,因此每个问题都在其自己的列中(请参见下面的最后三行)

data %>% 
  group_by(School_ID) %>% 
  gather(
    `Question ID`,
    Score,
    -School_ID
  ) %>% 
  group_by(School_ID, `Question ID`) %>% 
  summarise(
    Proportion = mean(Score)
  ) %>% 
  spread(
    `Question ID`,
    Proportion
  )