R语言:基于学生修课计数替换学期尝试学时列的NA值
NA值回填实现方案
适配你已生成的attempts统计表的回填方法
你已经完成了缺失值学生的修课数统计,只需两步即可完成值回填:
- 先在统计结果上计算好对应学时值,精简关联字段:
attempts <- attempts %>% mutate(calc_hrs = n * 3) # 修课数*单科学时3,得到目标替换值 select(ID, calc_hrs) # 仅保留ID和目标值,避免关联时引入多余字段
- 将计算值按ID关联回原数据集,替换对应NA值:
IR_Data <- IR_Data %>% left_join(attempts, by = "ID") %>% mutate( # 原列值为NA时取计算的学时值,非NA的原值完整保留 HRS_Sem1Attempted = coalesce(HRS_Sem1Attempted, calc_hrs) ) %>% select(-calc_hrs) # 删除临时关联的计算列,保持原表结构
一步到位的简化实现(推荐)
无需单独生成中间的attempts统计表,直接在原数据集上完成计算和替换,逻辑更连贯,也能避免关联匹配偏差:
IR_Data <- IR_Data %>% group_by(ID) %>% # 按学生ID分组 mutate( HRS_Sem1Attempted = ifelse( is.na(HRS_Sem1Attempted), # 判断当前位置是否为需要替换的NA n() * 3, # 分组内总修课数*单科学时3,作为替换值 HRS_Sem1Attempted # 非NA的记录保留原值 ) ) %>% ungroup() # 取消分组,避免后续操作受分组状态影响
逻辑说明:代码会自动识别每个学生的总修课行数,仅对该学生下属于NA的HRS_Sem1Attempted位置填入计算值,和你定义的“学生总尝试学时=修课行数*3”规则完全匹配。
结果验证
回填完成后可快速抽查关键学生的替换结果是否符合预期:
IR_Data %>% filter(ID %in% c(189, 323)) %>% select(ID, HRS_Sem1Attempted)
预期输出:学生189的对应行HRS_Sem1Attempted值为9,学生323的对应行HRS_Sem1Attempted值为12。
内容的提问来源于stack exchange,提问作者Jamie Warren
相关产品推荐
相关产品推荐

