Получить информацию по каждому предмету с учениками, сгруппированными по школам в R - PullRequest
0 голосов
/ 21 февраля 2019

Моя главная цель: у меня есть набор данных о многих учениках, их ответы на 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% правильно поняли Q1.

С учетом всех учеников 2-й школы (и только они) 30% получилиQ5 правильно и так далее.Для всех школ и всех предметов.

Надеюсь, это поможет вам лучше понять задачу.

1 Ответ

0 голосов
/ 21 февраля 2019

Поэтому я попытался скопировать ваш фрейм данных следующим образом:

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),
)

Далее вы можете использовать тидир или просто импортировать тидиверс, как это:

# 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, ID вопроса и Score.Затем я группируюсь по школьному идентификатору и идентификатору вопроса и применяю преобразование.

Бонус : вы добавляете выражение «распространение», чтобы снова транспонировать ваши данные, чтобы у вас был каждый вопрос в своемсобственный столбец (см. последние три строки ниже)

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
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...