如何判断分组内所有评分者的评分列是否一致?
问题描述
我有一个dataframe,每行代表一个项目组从三位评分者(advisor、mentor、other)处获得的评分。列ELA1、ELA2、MATH1、MATH2、ESS1、ESS2为可评分项,每组仅需被评定3项,但同组的三位评分者应评定相同的项目。需要检查同组内所有评分者是否评定了相同的项目集,并生成一个虚拟变量标记该组的评分者是否评定了相同的项目集。
示例数据如下:
df <- data.frame(group=c("A","A","A","B","B","B","C","C","C"), rater=c("Advisor", "Mentor", "Other", "Advisor", "Mentor", "Other", "Advisor", "Mentor", "Other"), ELA1=c(1, 2, 2, NA, NA, 1, NA, NA, NA), ELA2=c(NA, NA, NA, 2, NA, 1, NA, NA, NA), MATH1=c(3, 3, 2, NA, 2, NA, 3, 3, 2), MATH2=c(2, 3, 2, NA, NA, 1, 3, 3, 1), ESS1=c(NA, NA, NA, 2, 2, NA, 3, 3, 1), ESS2=c(NA, NA, NA, 2, 2, NA, NA, NA, NA))
示例中,A组和C组的三位评分者评定了相同的项目,而B组的评分者评定的项目集不一致,需要编写R代码识别此类不一致情况并生成指示列。
解决方案
核心思路是:先提取每个评分者实际评定的项目集,再按组检查所有评分者的项目集是否完全一致,最终生成一致性标记列。
步骤1:提取每个评分者的评定项目集
逐行筛选出非NA的评分列,将列名排序后拼接成字符串(避免列名顺序差异导致误判),作为该评分者的项目标识。
步骤2:按组验证一致性
对每个组,统计组内不同项目标识的数量,若数量为1则说明组内评分者的项目集一致,反之则不一致。
完整代码
library(dplyr) library(purrr) # 提取每行的评定项目集并格式化 df_processed <- df %>% rowwise() %>% mutate(assessed_items = paste(sort(names(.)[!is.na(c_across(ELA1:ESS2))]), collapse = ",")) %>% ungroup() # 按组生成一致性标记列 df_result <- df_processed %>% group_by(group) %>% mutate(consistent = as.integer(n_distinct(assessed_items) == 1)) %>% ungroup() # 查看结果 print(df_result)
代码说明
rowwise()+c_across(ELA1:ESS2):逐行处理所有评分列的数据。names(.)[!is.na(...)]:筛选出当前行非NA的评分列名,即该评分者实际评定的项目。sort()+paste(..., collapse=","):对列名排序后拼接成统一格式的字符串,确保同一项目集无论列名顺序如何都能被识别为相同标识。group_by(group)+n_distinct(assessed_items):按组统计不同项目标识的数量,若数量为1则标记consistent为1(一致),否则为0(不一致)。
结果验证
运行代码后,df_result中的consistent列会准确标记每组的一致性:
- A组、C组的
consistent值为1(项目集一致) - B组的
consistent值为0(项目集不一致)
内容的提问来源于stack exchange,提问作者helpneeder
相关产品推荐
相关产品推荐

