在R语言中补全缺失的Posttest参与者数据:用均值填充分数
在R语言中补全未参加Posttest的学生数据并填充平均分
先把你提供的示例数据转换成可直接运行的R代码,同时清理掉Student_ID里的星号标记:
# 构造示例数据 df <- data.frame( Test = c(rep("Pretest", 6), rep("Posttest", 4)), Student_ID = c("001", "002*", "003", "004", "005*", "006", "001", "003", "004", "006"), Scores = c(70, 65, 75, 60, 60, 67, 80, 76, 55, 79), stringsAsFactors = FALSE ) # 清理Student_ID中的星号 df$Student_ID <- gsub("\\*", "", df$Student_ID)
下面提供两种实现方式,推荐用tidyverse工具包,代码更简洁直观:
方法一:使用tidyverse工具包
library(tidyverse) # 获取所有学生的唯一ID,确保不遗漏任何学生 all_students <- df %>% pull(Student_ID) %>% unique() # 计算Posttest的平均分(仅用已参加测试的学生分数) posttest_avg <- df %>% filter(Test == "Posttest") %>% summarize(avg_score = mean(Scores)) %>% pull(avg_score) # 补全Posttest数据,为缺失学生填充平均分 complete_posttest <- df %>% filter(Test == "Posttest") %>% complete(Student_ID = all_students) %>% # 补全所有学生ID mutate( Test = "Posttest", # 统一Test列值 Scores = replace_na(Scores, posttest_avg) # 替换缺失分数为平均分 ) # 查看最终结果 print(complete_posttest)
运行后,002和005的Posttest分数会被填充为72.5(也就是现有Posttest分数的平均值:(80+76+55+79)/4=72.5)。
方法二:基础R实现(无需额外包)
如果不想加载工具包,可以用基础R代码完成:
# 获取所有学生ID all_students <- unique(df$Student_ID) # 计算Posttest平均分 posttest_scores <- df$Scores[df$Test == "Posttest"] posttest_avg <- mean(posttest_scores) # 筛选现有Posttest数据 existing_posttest <- df[df$Test == "Posttest", c("Student_ID", "Scores")] # 找出未参加Posttest的学生 missing_students <- setdiff(all_students, existing_posttest$Student_ID) # 为缺失学生创建数据行 missing_rows <- data.frame( Test = rep("Posttest", length(missing_students)), Student_ID = missing_students, Scores = rep(posttest_avg, length(missing_students)), stringsAsFactors = FALSE ) # 合并数据并排序 complete_posttest <- rbind(existing_posttest, missing_rows) complete_posttest <- complete_posttest[order(complete_posttest$Student_ID), ] # 查看结果 print(complete_posttest)
两种方法最终得到的结果一致,你可以根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者Faisal Mustafa
相关产品推荐
相关产品推荐

