【问题标题】:For loop to check if value exists in other dataframeFor循环检查其他数据帧中是否存在值
【发布时间】:2019-06-12 11:58:00
【问题描述】:

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

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

Dataframe 1(我们称之为 Academic)如下所示:

      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。我想创建一个循环来检查学术数据框中的组中是否存在 course_code(即通过 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

【问题讨论】:

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


    【解决方案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)))
    

    【讨论】:

    • 非常感谢罗纳克!这就是工作!我将进一步研究您的代码,因为还必须提取每门课程的成绩;也许我也可以使用你的代码
    【解决方案2】:

    你也可以使用 tidyr。

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

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 2020-02-03
      • 2021-11-17
      • 2022-01-02
      • 2023-03-09
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多