我想为每个学生选择最好的 2 个测验考试结果(最高分和最高出勤率),并在 3 个测验考试中消除最弱的测验。我们可能会说我想从每行的 3 列中选择最好的 2 列。然后新建一个数据框有StudentID, ExamQuiz1, ExamQuiz2, ExamMidterm and ExamFinal
。我可以通过循环遍历表来处理它,这在 RI 假设中效率太低。处理 dplyr 包问题的有效方法是什么?
极简数据
伪数据框放置在底部。“ G
”表示学生没有参加考试,所以我想保留该值而不是将其替换为 0。例如,如果他用 G ( ExamQuiz1
), 0 ( ExamQuiz2
), 10 ( ExamQuiz3
)得到这个场景,我必须选择 0 作为ExamQuiz1
和 10 作为ExamQuiz2
测验输入。因为0比G
因为出勤面好。如果有结果(带数字),则表示该学生已经参加。列下的每个单元格都ExamQuiz1, ExamQuiz2, ExamMidterm and ExamFinal
可能有数字(考试结果)或字符值(“ G
” > 未参加)。我不会触及 ExamMidterm 和 ExamFinal 列的任何值。主要思想只与ExamQuiz1, ExamQuiz2, and ExamQuiz3
.
StudentID ExamQuiz1 ExamQuiz2 ExamQuiz3 ExamMidterm ExamFinal
1 11111 0 G G G G
2 22222 0 G 43 71 18
3 33333 0 G G G G
4 44444 0 G G G G
5 55555 60 38 G 64 27
6 66666 0 G G G G
编辑:仍有一些评论者不断指出数据不整洁。正如我在评论中所解释的那样,这样做的原因或您提供的整理方法对我来说没有意义。出于这个原因,我在不改变数据结构的情况下对问题主体进行了更多解释。
一个基本的 R 解决方案
cbind(df[-(2:4)], t(apply(df[2:4], 1, function(x){
c(x[x == "G"], sort(x[x != "G"]))[-1]
})))
# StudentID Midterm Final 1 2
# 1 11111 G G G 0
# 2 22222 71 18 0 43
# 3 33333 G G G 0
# 4 44444 G G G 0
# 5 55555 64 27 38 60
# 6 66666 G G G 0
在你的规则中,G
应该放在任何数字前面。所以一开始我把所有存在的东西放在G
一个向量的开头并附加排序的分数。删除向量中的第一个元素后,将保留前 2 个分数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句