You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:50:17