R语言Tidyverse环境下为全A、仅A/B成绩的学生创建哑变量
实现逻辑
完全匹配你给出的示例输出的判定规则如下:
- 按学生id聚合所有科目成绩,逐人计算标记值,不需要对长表做宽表转换
all_As标记:该生所有科目成绩均属于A等级细分(兼容A+、A、A-等所有以A开头的成绩),符合记1,否则记0As_and_Bs标记:该生所有科目成绩仅由A、B等级构成(无C及以下等级),且不属于全A学生集合(匹配示例中全A学生该标记为0的规则),符合记1,否则记0
可运行代码
library(dplyr) library(stringr) # 基于给定的original_df直接计算目标哑变量 result_df <- original_df %>% group_by(id) %>% summarise( all_As = as.integer(all(str_starts(grade, "A"))), As_and_Bs = as.integer( all(str_starts(grade, "A|B")) & !all_As ) )
结果匹配校验
代码运行输出和你提供的目标summarized_df完全一致:
- 001号学生:3科成绩分别为A+、A、A-,全A → all_As=1,As_and_Bs=0
- 002号学生:3科成绩分别为A、B+、B-,仅含A/B类成绩且非全A → all_As=0,As_and_Bs=1
- 003号学生:3科成绩分别为A、A、A-,全A → all_As=1,As_and_Bs=0
- 004号学生:3科成绩含C类 → all_As=0,As_and_Bs=0
适配调整说明
- 如果实际需求中
As_and_Bs需要包含全A学生(即只要无C及以下等级成绩,不管是否全A都标记为1),删掉判定条件里的& !all_As即可 - 若存在特殊成绩编码(比如文字等价等级),仅需修改
str_starts的匹配范围,无需调整整体分组逻辑 - 该方案不需要预先枚举所有可能的A/B类成绩值,后续新增A+、B-之类的细分等级时,代码可以直接兼容
内容的提问来源于stack exchange,提问作者Mishalb
相关产品推荐
相关产品推荐

