如何拆分长格式数据集为双列测量值以适配ICC分析
R实现长格式数据滑动配对生成ICC分析数据集
你需要的滑动配对逻辑本质是按受试者分组后,取相邻两次测量值为一对,步长为1,用dplyr的窗口函数可以高效实现,哪怕十万行级数据也能秒出结果,完全适配千行以上的处理需求。
完整实现代码
# 加载dplyr包,没有安装先跑install.packages("dplyr") library(dplyr) # 示例数据 set.seed(1) df <- data.frame(id = c(rep(1, 5), rep(2, 5)), visit = rep(1:5,2), measure = round(runif(10), digits = 2)) # 生成符合要求的配对数据集 df2 <- df %>% # 先按受试者id、测量时点排序,避免顺序错乱导致配对错误 arrange(id, visit) %>% # 按受试者分组,保证不同人的测量值不会混在一起配对 group_by(id) %>% mutate( measure1 = measure, # 取当前行的下一个测量值作为第二列 measure2 = lead(measure, 1), # 按你给出的示例结构,每个受试者下的配对visit从1开始编号 visit = row_number() ) %>% # 剔除每个受试者最后一个无法配对的测量值(没有下一个测量点) filter(!is.na(measure2)) %>% # 按需要保留列 select(id, visit, measure1, measure2) %>% ungroup()
结果验证
运行代码后查看id=1的前2行,和你给出的预期结构完全一致:
head(df2 %>% filter(id == 1), 2)
输出:
# A tibble: 2 × 4 id visit measure1 measure2 <dbl> <int> <dbl> <dbl> 1 1 1 0.27 0.37 2 1 2 0.37 0.57
注意事项
- 处理前必须排序:如果原始数据的测量时点顺序是乱的,不排序直接滑动会得到错误的配对结果
- 如果你需要保留配对对应的原始首次测量时点,把代码里
visit = row_number()替换成visit = visit即可 - 输出的数据集可以直接传入ICC计算函数,比如
irr::icc(select(df2, measure1, measure2))就能直接计算组内相关系数
内容的提问来源于stack exchange,提问作者Orangemarmalade
相关产品推荐
相关产品推荐

