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

如何按期刊要求将森林图汇总列的"."替换为"-"?

替换metafor森林图汇总列的小数点为横杠

需求:按照期刊要求,将森林图最右侧汇总列中的所有小数点"."替换为横杠"-"(例如"0.43"改为"0-43"),基于metafor包实现该调整。

解决方案思路

metafor的forest()函数默认自动生成汇总行文本,无法直接修改小数点格式,因此需要自定义汇总行的文本内容:先提取汇总结果的数值并替换小数点,再手动添加到图中对应位置。

修改后的代码示例

library(metafor)

# 导入BCG疫苗荟萃分析数据
dat <- dat.bcg

# 计算对数风险比及抽样方差,添加研究标签
dat <- escalc(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat,
              slab=paste(author, year, sep=", "))

# 拟合随机效应模型
res <- rma(yi, vi, data=dat)

# 提取汇总结果并替换小数点为横杠
rr_val <- exp(res$b)
ci_lb <- exp(res$ci.lb)
ci_ub <- exp(res$ci.ub)
# 格式化数值(保留两位小数)并替换小数点
rr_formatted <- gsub("\\.", "-", sprintf("%.2f", rr_val))
ci_formatted <- paste(gsub("\\.", "-", sprintf("%.2f", ci_lb)), 
                      gsub("\\.", "-", sprintf("%.2f", ci_ub)), 
                      sep="-")
summary_text <- paste0("RE Model: ", rr_formatted, " (", ci_formatted, ")")

# 绘制森林图,预留汇总行位置(mlab="")
forest(res, atransf=exp, at=log(c(0.05, 0.25, 1, 4)), xlim=c(-16,6),
       ilab=cbind(tpos, tneg, cpos, cneg), ilab.lab=c("TB+","TB-","TB+","TB-"),
       ilab.xpos=c(-9.5,-8,-6,-4.5), cex=0.75, header="Author(s) and Year",
       mlab="", shade=TRUE)

# 添加自定义的汇总文本到右侧汇总列位置
text(x=6, y=res$k+2, pos=2, summary_text, cex=0.75)

# 添加分组标签
text(c(-8.75,-5.25), res$k+3, c("Vaccinated", "Control"), cex=0.75, font=2)

代码说明

  1. 提取并格式化数值:用exp()将对数尺度的模型结果转换为原始风险比,sprintf()控制小数位数,gsub("\\.", "-", ...)完成小数点到横杠的替换。
  2. 绘制基础森林图:设置mlab=""关闭自动生成的汇总文本,预留自定义文本的位置。
  3. 手动添加汇总文本:通过text()函数将格式化后的汇总文本放到森林图右侧对应行(y坐标res$k+2对应汇总行位置,x坐标6匹配图的右侧区域)。

内容的提问来源于stack exchange,提问作者Lenman55

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:54:49