我的主要目标:我有一个包含许多学生的数据框,他们在测试中对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正确,依此类推。适用于所有学校和所有项目。
我希望这可以使您更轻松地尝试并更好地理解挑战。
答案 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
)