For循环检查其他数据框中是否存在值

时间:2019-06-12 11:58:00

标签: r for-loop if-statement group-by

我有一个大型数据框,其中包含31181个观测值和9个变量。在此数据框中,记录了学生的学习成绩。

我还有第二个数据框,其中每个学生以1行表示。在这一行中,我想存储他/她从学习成绩数据框中获得的结果。

数据框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

数据框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

如您所见,所有课程列均不适用。我想创建一个循环,以检查学术数据框中的课程代码是否存在于某个组中(即按Student_ID),然后在NewData数据框中的特定课程列中放入1,如果学生没有这样做,则将其放入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 个答案:

答案 0 :(得分:1)

使用基数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)))

答案 1 :(得分:1)

您也可以使用tidyr。

library(tidyr)
library(dplyr)

Academic$value = 1
NewData = Academic %>% spread(key = Course_code, value = value)
NewData[is.na(NewData)] = 0