Для цикла, чтобы проверить, существует ли значение в другом кадре данных - PullRequest
0 голосов
/ 12 июня 2019

У меня большой массив данных с 31181 наблюдением и 9 переменными. В этом информационном блоке регистрируется успеваемость студентов.

У меня также есть второй кадр данных, в котором каждый студент представлен в 1 строке. В этом ряду я хотел бы сохранить его / ее результаты из академической таблицы данных успеваемости.

Dataframe 1 (назовем его академическим) выглядит следующим образом:

      Programme Resits Student_ID Course_code Academic_year Course_Grade_Binned Graduated Master_Student Course.rating_M Rating.tutor_M Selfstudy_M
1            IB      0    9000006     ABC1198          2013                   B      TRUE              1             7.5            8.2        14.1
2            IB      0    9000006     ABC1192          2014                   B      TRUE              1             8.4            8.8        13.0
3            IB      0    9000006     ABC1277          2014                   A      TRUE              1             6.0            6.4        10.6
4            IB      0    9000006     ABC1448          2013                   B      TRUE              1             5.7            7.8        14.4
5            IB      0    9000006     ABC1120          2014                   B      TRUE              1             7.1            7.4        11.2
6            IB      0    9000006     ABC1362          2013                   B      TRUE              1             6.7            7.5        15.8
7            IB      0    9000006     ABC1213          2013                   C      TRUE              1             7.7            8.1        11.4
8            IB      0    9000006     ABC1382          2013                   B      TRUE              1             6.6            7.1        16.3
9            IB      0    9000006     ABC1108          2013                   C      TRUE              1             7.1            7.6        15.7
10           IB      1    9000006     ABC1329          2014                   B      TRUE              1             7.5            7.9        10.7
11           IB      0    9000006     ABC1126          2013                   B      TRUE              1             6.7            7.5        15.3
12           IB      0    9000006     ABC1003          2013                   B      TRUE              1             7.3            8.5        12.6
13           IB      0    9000014     ABC1309          2014                   B      TRUE              0             6.9            6.1        12.4
14           IB      0    9000014     ABC1198          2013                   A      TRUE              0             7.5            8.2        14.1
15           IB      0    9000014     ABC1277          2014                   A      TRUE              0             6.0            6.4        10.6
16           IB      0    9000014     ABC1448          2013                   A      TRUE              0             5.7            7.8        14.4
17           IB      0    9000014     ABC1362          2013                   B      TRUE              0             6.7            7.5        15.8
18           IB      0    9000014     ABC1213          2013                   B      TRUE              0             7.7            8.1        11.4
19           IB      0    9000014     ABC1152          2014                   A      TRUE              0             7.0            7.6        12.3
20           IB      0    9000014     ABC1382          2013                   A      TRUE              0             6.6            7.1        16.3
21           IB      0    9000014     ABC1108          2013                   B      TRUE              0             7.1            7.6        15.7
22           IB      0    9000014     ABC1455          2014                   A      TRUE              0             6.7            7.3        11.2
23           IB      0    9000014     ABC1126          2013                   B      TRUE              0             6.7            7.5        15.3
24           IB      0    9000014     ABC1003          2013                   A      TRUE              0             7.3            8.5        12.6
25           IB      1    9000028     ABC1213          2014                   C      TRUE              0             7.8            8.6        10.7
26           IB      0    9000028     ABC1198          2014                   B      TRUE              0             7.1            8.0        15.5

Dataframe 2 (назовем его NewData) выглядит следующим образом:

 Student_ID Master Resits Programme ABC1198 ABC1192 ABC1277 ABC1448 ABC1120 ABC1362 ABC1213 ABC1382 ABC1108 ABC1329 ABC1126 ABC1003 ABC1309 ABC1152 ABC1455 ABC1123 ABC1409
1    9000006      1      1        IB      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
2    9000014      0      0        IB      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
3    9000028      0      5        IB      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
4    9000045      1      5       EBE      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA

Как вы видите, все столбцы курса по-прежнему NA. Я хотел бы создать цикл, чтобы проверить, существует ли код_курса в группе (т.е. по Student_ID) в академическом фрейме данных, а затем поставить 1 в столбце определенного курса в фрейме данных NewData и 0, если студент этого не делал курс.

Конечный результат (NewData) должен выглядеть следующим образом:

 Student_ID Master Resits Programme ABC1198 ABC1192 ABC1277 ABC1448 ABC1120 ABC1362 ABC1213 ABC1382 ABC1108 ABC1329 ABC1126 ABC1003 ABC1309 ABC1152 ABC1455 ABC1123 ABC1409
1    9000006      1      1        IB      1      1      1      1      1      1      1      0      1      1      1      1      1      0      0      0      0

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Вы также можете использовать тидир.

library(tidyr)
library(dplyr)

Academic$value = 1
NewData = Academic %>% spread(key = Course_code, value = value)
NewData[is.na(NewData)] = 0
1 голос
/ 12 июня 2019

Используя базу R, мы можем сначала определить столбцы, в которых предметы присутствуют в NewData. split Course_code на основе Student_ID и создайте логический вектор, используя %in% на основе предметов, присутствующих для каждого учащегося.

cols <- 5:ncol(NewData)

NewData[cols] <- t(sapply(split(Academic$Course_code, Academic$Student_ID),
                    function(x) +(names(NewData)[cols] %in% x)))
...