【发布时间】:2021-07-18 15:46:20
【问题描述】:
我在 R 中有一个包含学生成绩数据的数据框。下面是一些示例数据来展示它的结构:
student.data <- data.frame(
"CourseNumber" = c(101, 101, 101, 102, 102, 102, 103, 103, 104, 104, 104, 105, 106, 106, 106),
"TermID" = c("T1", "E1", "S1", "T1", "E1", "S1", "T1", "S1", "T1", "E1", "S1", "S1", "T1", "E1", "S1"),
"StudentID" = c("9100", "9100", "9100", "9100", "9100", "9100", "9100", "9100", "9100", "9100", "9100", "8640", "8640", "8640", "8640"),
"Grade" = c(92, 80, 91, 83, 87, 84, 79, 79, 79, 85, 81, 98, 93, 97, 94))
student.data
## CourseNumber TermID StudentID Grade
## 1 101 T1 9100 92
## 2 101 E1 9100 80
## 3 101 S1 9100 91
## 4 102 T1 9100 83
## 5 102 E1 9100 87
## 6 102 S1 9100 84
## 7 103 T1 9100 79
## 8 103 S1 9100 79
## 9 104 T1 9100 78
## 10 104 E1 9100 85
## 11 104 S1 9100 81
## 12 105 S1 8640 98
## 13 106 T1 8640 93
## 14 106 E1 8640 97
## 15 106 S1 8640 94
一个学生通常(但不总是)在一门课程中获得 3 个成绩:S1、E1 和 S1。这就是为什么我在打印输出中添加了额外的中断——每组 3 代表一个学生在单个课程中的成绩。 T1是他的考前成绩,E1是他的期末考试成绩,S1是他的考后成绩。这 3 个应该与这个公式 S1 = (80%)(T1) + (20%)(E1) 相关,我正在寻找获得更高 S1 成绩的实例。
我的问题是我需要删除第 7、8 和 12 行,因为这些课程并未授予所有 3 个成绩(T1、E1、S1)。这会有所帮助,因为我已经有一些代码可以成功计算出老师给出的“碰撞”量,但是每次到达一个没有全部 3 个成绩的学生课程组合(T1、E1、和 S1)。
所以,我的问题是:如何删除不完全是 3 个重复项的所有行,由变量 CourseNumber 和 StudentID 确定? (如果它删除所有 少于 个重复项的行,或者即使它只是删除了恰好有 2 个重复项的所有行,则该解决方案将有效。)
我找到了this clever answer 并尝试了下面的代码,但它只删除了根本没有重复的行。因此,它会删除第 12 行,但不会同时删除第 7 行和第 8 行。
temp <- student.data[ , c("CourseNumber","StudentID") ]
student.data <- student.data[duplicated(temp) | duplicated(temp, fromLast = TRUE), ]
student.data
## CourseNumber TermID StudentID Grade
## 1 101 T1 9100 92
## 2 101 E1 9100 80
## 3 101 S1 9100 91
## 4 102 T1 9100 83
## 5 102 E1 9100 87
## 6 102 S1 9100 84
## 7 103 T1 9100 79
## 8 103 S1 9100 79
## 9 104 T1 9100 78
## 10 104 E1 9100 85
## 11 104 S1 9100 81
## 13 106 T1 8640 93
## 14 106 E1 8640 97
## 15 106 S1 8640 94
这是我想要实现的输出:
## CourseNumber TermID StudentID Grade
## 1 101 T1 9100 92
## 2 101 E1 9100 80
## 3 101 S1 9100 91
## 4 102 T1 9100 83
## 5 102 E1 9100 87
## 6 102 S1 9100 84
## 9 104 T1 9100 78
## 10 104 E1 9100 85
## 11 104 S1 9100 81
## 13 106 T1 8640 93
## 14 106 E1 8640 97
## 15 106 S1 8640 94
【问题讨论】:
标签: r duplicates data-cleaning