如何在R中按评分对象(Ratee)分组迭代修改评分者(Rater)标识以适配irr包计算评分者间信度?
解决评分者ID重命名与评分者间信度计算的问题
没问题,这个数据格式转换的需求其实很常见,用分组内生成序号的方法就能轻松搞定!下面给你几种不同的实现方式,选你习惯的R工具链来用就行:
方法一:用tidyverse/dplyr实现(推荐,代码可读性高)
如果你平时习惯用tidyverse系列包,用dplyr的分组+序号生成就能快速完成Rater重命名:
# 先加载dplyr(如果没安装先运行install.packages("dplyr")) library(dplyr) # 你的示例数据集(可以替换成你自己的数据集) df <- tibble( Rater = c(11111, 12112, 12232, 12457, 16794, 55555, 66666, 77777, 88888, 99999), Ratee = c(12345, 12345, 12345, 12345, 12345, 16454, 16454, 16454, 16454, 16454), Rating = c(1, 1, 0, 0, 1, 0, 1, 1, 0, 1) ) # 核心转换步骤:按Ratee分组,给每个组内的评分者生成r1/r2...的命名 df_transformed <- df %>% group_by(Ratee) %>% mutate(Rater = paste0("r", row_number())) %>% ungroup() # 查看转换后的结果 print(df_transformed)
代码解释:
group_by(Ratee):把数据按评分对象ID分组,确保序号只在每个Ratee内部生成row_number():在每个分组内生成从1开始的连续序号paste0("r", row_number()):把序号和前缀"r"拼接,得到你需要的r1/r2格式ungroup():取消分组状态,避免后续操作受分组影响
方法二:Base R实现(无需额外安装包)
如果你不想加载额外的包,用Base R的ave()函数也能实现相同效果:
# 直接在原数据框上修改Rater列 df$Rater <- with(df, paste0("r", ave(Rater, Ratee, FUN = function(x) seq_along(x)))) # 查看结果 print(df)
代码解释:
ave(Rater, Ratee, FUN = function(x) seq_along(x)):按Ratee分组,对每个组的Rater列应用seq_along()生成组内序号paste0()同样负责拼接前缀"r"和序号
下一步:转换为irr包需要的宽格式
irr包的多数信度计算函数(比如kripp.alpha()、kappa2())需要宽格式数据(每个评分者一列,每个Ratee一行),你可以用tidyr的pivot_wider()完成转换:
# 加载tidyr(属于tidyverse,若未安装先运行install.packages("tidyr")) library(tidyr) df_wide <- df_transformed %>% pivot_wider(names_from = Rater, values_from = Rating) # 查看宽格式数据(Ratee为行,r1/r2等为列) print(df_wide)
计算评分者间信度
转换完宽格式后,就可以用irr包计算信度了,比如计算适用于多个评分者的Krippendorff's Alpha:
# 加载irr包(未安装先运行install.packages("irr")) library(irr) # 计算信度:排除第一列的Ratee ID,只传入评分列 kripp.alpha(df_wide[, -1])
内容的提问来源于stack exchange,提问作者Adrien McCulloch
相关产品推荐
相关产品推荐

