如何用R编写函数计算学生4次测试中3次最佳成绩的平均分
计算学生三次最佳测试成绩平均分的问题解决
数据与需求
现有包含10名学生4次测试成绩的DataFrame如下:
noma interro1 interro2 interro3 interro4 1 836016120449 6 3 NA 3 2 596844884419 1 4 2 8 3 803259953398 2 2 9 1 4 658786759629 3 1 3 2 5 571155022756 4 9 1 4 6 576037886365 8 7 8 7 7 045086625199 9 6 7 6 8 621909979467 5 8 4 5 9 457029205538 7 5 6 9 10 402526220817 NA 10 5 10
需求是编写R函数,计算每位学生4次测试里3次最佳成绩的平均分,并完成10名学生的计算。
初始代码及错误
最初编写的函数和调用代码如下:
average <- function(t){ x <- sort(t, decreasing = TRUE)[1:3] return(mean(x, na.rm=TRUE)) } apply(interro2, 1, average)
运行后出现错误提示:
In mean.default(x, na.rm = TRUE) : argument is not numeric or logical: returning NA
尝试修改函数为:
average <- function(t){ rowMeans(sort(t, decreasing = TRUE, na.rm=TRUE)[1:3]) }
但问题依然存在。
问题根源与修正方案
最终发现问题出在没有排除DataFrame中存储学生编号的第一列:第一列noma是字符类型的学生编号,当用apply(interro2, 1, average)处理整行时,会把字符和数值型成绩混在一起传入函数,导致mean无法处理非数值类型,从而返回NA。
修正后的代码只需在调用apply时排除第一列,只处理成绩列即可:
average <- function(t){ x <- sort(t, decreasing = TRUE)[1:3] return(mean(x, na.rm=TRUE)) } apply(interro2[-1], 1, average)
这样就能正常计算每位学生三次最佳成绩的平均分了。
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

