如何基于指定规则按行判定学生成绩(R语言实现)
R语言实现成绩等级判定逻辑
判定规则
- PASSED:总分大于200,且所有科目分数均大于33
- ER(Essential Repeat):总分大于200,且有1-2科分数低于33
- FAILED:超过2科分数低于33,或总分≤200
实现代码
方法1:使用dplyr包(推荐,代码更直观)
library(dplyr) # 原始数据框 df <- data.frame( student = c("a", "b", "c", "d", "e"), subject1 = c(40, 50, 60, 70, 80), subject2 = c(35, 45, 55, 65, 75), subject3 = c(38, 48, 58, 68, 78), subject4 = c(33, 34, 35, 36, 37), subject5 = c(42, 52, 62, 72, 82) ) # 添加总分、不及格科目数,并判定等级 df <- df %>% mutate(total_score = rowSums(select(., starts_with("subject")))) %>% mutate(failed_subjects = rowSums(select(., starts_with("subject")) < 33)) %>% mutate(grade = case_when( total_score > 200 & failed_subjects == 0 ~ "PASSED", total_score > 200 & between(failed_subjects, 1, 2) ~ "ER", TRUE ~ "FAILED" )) # 查看结果 print(df)
方法2:基础R实现(无需额外包)
# 原始数据框 df <- data.frame( student = c("a", "b", "c", "d", "e"), subject1 = c(40, 50, 60, 70, 80), subject2 = c(35, 45, 55, 65, 75), subject3 = c(38, 48, 58, 68, 78), subject4 = c(33, 34, 35, 36, 37), subject5 = c(42, 52, 62, 72, 82) ) # 计算总分 df$total_score <- rowSums(df[, grepl("subject", names(df))]) # 计算低于33分的科目数量 df$failed_subjects <- rowSums(df[, grepl("subject", names(df))] < 33) # 按规则判定等级 df$grade <- ifelse(df$total_score > 200 & df$failed_subjects == 0, "PASSED", ifelse(df$total_score > 200 & df$failed_subjects %in% 1:2, "ER", "FAILED")) # 查看结果 print(df)
结果说明
运行代码后,数据框会新增total_score(总分)、failed_subjects(低于33分的科目数)和grade(等级)三列。针对示例数据,最终结果为:
- 学生a:总分188≤200 → FAILED
- 学生b、c、d、e:总分均大于200且无低于33分的科目 → PASSED
内容的提问来源于stack exchange,提问作者Ramakrishna S
相关产品推荐
相关产品推荐

