根据R学校分组的学生获取每个项目的信息

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (10)

我的主要目标:我拥有大量学生的数据框,他们对45项测试的回答,以及45项中每项的正确答案。有些学生来自同一所学校(我们每所学校都有一个学生证)。

我需要的是在每个学校和每个项目中获得正确回答项目的人的百分比。

我能够分离向量,并为每个学生校正测试,然后我有一个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%的学生获得了正确的答案。

考虑到来自学校2(并且只有他们)的所有学生,30%的学生得到了Q5,依此类推。适用于所有学校和所有项目。

我希望这可以让您更轻松地尝试更好地了解挑战。

提问于
用户回答回答于

所以我试图按如下方式复制数据框:

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分组并应用转换。

您添加“传播”语句以再次转置您的数据,以便您在每个列中都有自己的问题(请参阅下面的最后三行)

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
  )

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问9 回答
  • 四无君

    0 粉丝0 提问3 回答
  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问2 回答
  • o o

    3 粉丝490 提问2 回答

扫码关注云+社区

领取腾讯云代金券