R语言编写report_card函数结合sapply生成带fail标记的成绩矩阵
疑问解答
- 关于sapply的适用性:完全可以用。R中向量/矩阵如果同时包含数值和文本内容,会自动统一为字符存储类型,不存在类型冲突问题;且sapply会自动将遍历返回的等长结果简化为矩阵结构,刚好匹配你需要的输出格式,比用lapply少一步手动转换结构的操作。
- 关于嵌套列表的处理逻辑:你的数据是两层嵌套结构:第一层是所有学生的成绩集合,每个列表元素对应1名学生的全部成绩;第二层是单个学生的各科成绩,每个子元素对应1个科目的分数向量。写自定义函数时只需要针对单个学生的成绩子列表做处理即可,外层的跨学生遍历交给sapply完成。
可直接运行的实现代码
# 初始化给定的成绩数据 brice_grades <- list(math = c(90, 64, 100), reading = c(55, 71, 50), science = c(100, 100, 98)) talia_grades <- list(math = c(70, 64, 70), reading = c(100, 80, 50), science = c(100, 92, 98)) annie_grades <- list(math = c(14, 64, 50), reading = c(90, 71, 99), science = c(88, 70, 98)) # 将所有学生成绩整合为一个大列表,作为sapply的遍历对象 all_grades <- list( brice_grades = brice_grades, talia_grades = talia_grades, annie_grades = annie_grades ) # 自定义report_card函数:输入为单个学生的成绩列表 report_card <- function(student_score) { # 计算该学生每门科目的平均分 subject_avg <- sapply(student_score, mean) # 按规则替换结果:低于70分标记为fail,其余保留1位小数 output <- ifelse(subject_avg < 70, "fail", sprintf("%.1f", subject_avg)) return(output) } # 配合sapply生成最终成绩矩阵 grade_matrix <- sapply(all_grades, report_card)
运行以下命令打印结果,即可得到和预期完全一致的输出:
print(grade_matrix, quote = FALSE)
打印效果:
brice_grades talia_grades annie_grades math 84.7 fail fail reading fail 76.7 86.7 science 99.3 96.7 85.3
内容的提问来源于stack exchange,提问作者bricevk
相关产品推荐
相关产品推荐

