使用purrr的map函数配合ggplot为每个PAT绘制折线图报错求解
代码错误点及修正方案
核心错误梳理
- 大小写不匹配:你创建的数据集命名为
Lb1(首字母大写),后续调用时用的是小写lb1,R对变量名大小写敏感,会直接报对象未找到错误。 - 迭代逻辑错误:你将PAT的唯一值向量
subj传入map的.x参数,此时匿名函数内的.x本身就是单个PAT的取值,不是索引,不需要用subj[.x]的方式取值,该写法会把PAT值当下标读取,匹配到完全错误的结果。 - 列名不一致:你提取
Lb1时仅选中了PAT、RES、PARAMCD、AVISITN、LBSTNRHI五列,后续filter用了不存在的SUBJID列,ggplot映射用了不存在的VISIT、AVAL列,都会触发列未找到的报错。
修正后代码
# 第一步:选入所有需要用到的列,以下列名可按需替换为你实际的字段名 lb1 <- labs[, c("PAT","RES","PARAMCD","AVISITN","LBSTNRHI")] # 提取所有唯一的受试者PAT编号 subj <- unique(lb1$PAT) # 迭代生成每个受试者的折线图 p1 <- map(.x = subj, .f = ~ lb1 %>% filter(PAT == .x & PARAMCD %in% c("CA", "HGB", "BILI", "BILDIR")) %>% ggplot(aes(x = AVISITN, y = RES, color = PARAMCD)) + geom_point(na.rm = TRUE) + geom_line(na.rm = TRUE) + ggtitle(label = .x)) # 查看第一个受试者的测试图 p1[[1]]
补充说明
- 如果你实际的访视字段名为
VISIT、检测结果字段名为AVAL、受试者ID字段名为SUBJID,请在第一步选列时就把对应字段加进去,同步修改filter和aes内的映射字段即可。 - 若需要批量导出所有图片,直接遍历
p1列表配合ggsave使用即可。
内容的提问来源于stack exchange,提问作者user11493891
相关产品推荐
相关产品推荐

