You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一参与者存在多行随访数据时如何合并行并绘制进度图

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:54:03