同一参与者存在多行随访数据时如何合并行并绘制进度图
解决方案
1. 合并同一参与者的多行数据
你之前仅调用了group_by()但没有搭配聚合函数,因此不会触发行合并操作。可以通过以下两种方法实现需求:
方法1:基于原始数据直接生成宽表(更简便)
使用tidyr::pivot_wider()可一步完成宽表转换,自动将未参与的随访标记为0:
library(tidyverse) # 原始数据 participant <- c(1,1,1,2,3,3,4,5,5,5 ) visit <- c(1,2,3,3,2,3,1,1,2,3) df <- data.frame(participant, visit) # 转换为每个参与者一行的宽表 df_wide <- df %>% mutate(attended = 1) %>% pivot_wider( id_cols = participant, names_from = visit, names_prefix = "Visit", values_from = attended, values_fill = 0 )
输出的df_wide就是你需要的合并后数据,每个参与者占一行,三列Visit分别对应三次随访的参与状态。
方法2:基于你已生成的df1数据合并
如果你要继续使用已经创建好Visit列的df1,只要在group_by()后搭配summarise()聚合即可:
df_wide <- df1 %>% group_by(participant) %>% summarise(across(everything(), max))
这里取每列最大值的逻辑是:同一参与者的同一Visit列中,只要参与过对应随访值就为1,未参与为0,取max即可得到合并后的最终状态。
2. 制作目标进度图
你需要的随访进度图可以用ggplot2的geom_tile()实现,不需要先转宽表,直接用原始长数据绘图效率更高:
df %>% mutate(attended = "已参与") %>% # 补全所有参与者与随访的组合,未参与的标记为对应状态 complete(participant, visit, fill = list(attended = "未参与")) %>% ggplot(aes( x = factor(visit, levels = 1:3, labels = paste0("第",1:3,"次随访")), y = factor(participant, levels = rev(sort(unique(participant)))) )) + # 用瓷砖图展示参与状态 geom_tile(aes(fill = attended), color = "white", size = 1) + # 自定义配色 scale_fill_manual(values = c("已参与" = "#2c7fb8", "未参与" = "#f0f0f0")) + # 调整标签和主题 labs(x = "随访次数", y = "参与者编号", fill = "参与状态") + theme_minimal() + theme( axis.text.y = element_text(hjust = 1), panel.grid = element_blank() )
运行上述代码即可得到和示例一致的进度图,y轴按参与者编号倒序排列,每列对应一次随访,颜色区分参与状态。
内容的提问来源于stack exchange,提问作者Helen Andrews
相关产品推荐
相关产品推荐

