R语言快速生成三线表(1)

R语言的优势在于批量处理,常使用到循环和函数,三线表是科研文章中必备的内容。利用函数实现自动判断数据类型和计算。使用R包(table1)。

复制代码
# 创建连续性变量
continuous_var1 <- c(1.2, 2.5, 3.7, 4.8, 5.9)
continuous_var2 <- c(10.5, 20.3, 15.2, 8.7, 12.1)
continuous_var3 <- c(0.3, 0.7, 1.1, 2.0, 1.5)

# 创建分类变量
category_var1 <- factor(c("A", "B", "A", "C", "B"))
category_var2 <- factor(c("X", "Y", "Z", "X", "Z"))
category_var3 <- factor(c("High", "Low", "Medium", "Medium", "High"))

# 创建data.frame
df <- data.frame(
  ContinuousVar1 = continuous_var1,
  ContinuousVar2 = continuous_var2,
  ContinuousVar3 = continuous_var3,
  CategoryVar1 = category_var1,
  CategoryVar2 = category_var2,
  CategoryVar3 = category_var3
)

# 显示data.frame
df

#generate three line table
#pvalue
pvalue <- function(x, name, ...){
  y <- df[[name]]#variable
  g <- df[,"Group"]#Group
  if (is.numeric(y)) {
    if (shapiro.test(y)$p.value>0.05){
      p <- t.test(y ~ g)$p.value
      p_with_symbol <- paste0(format.pval(p, digits = 3, eps = 0.001), "*")
    }else{
      p <- wilcox.test(y ~ g)$p.value
      p_with_symbol <- paste0(format.pval(p, digits = 3, eps = 0.001), "**")
      }
  }else{
    if (length(y) > 40 & any(sapply(chisq.test(y,g)$expected, function(x) x >=1))){
      p <- chisq.test(y, g)$p.value
      p_with_symbol <- paste0(format.pval(p, digits = 3, eps = 0.001,trim = FALSE), "#")
      } else {
        p<-fisher.test(y,g)$p.value
        p_with_symbol <- paste0(format.pval(p, digits = 3, eps = 0.001), "##")
      }
  }
  c("",  p_with_symbol)
}

#自定义函数准备显示统计值(t值或卡方值)
stat_value <- function(x, name, ...) {
  y <- df[[name]] # 变量
  g <- df[,"Group"] # 分组变量
  if (is.numeric(y)) {
    # 连续变量使用 t 检验或 Mann-Whitney U 测试
    if (shapiro.test(y)$p.value > 0.05) {
      s <- abs(t.test(y ~ g)$statistic[["t"]]) # 正态分布,使用 t 检验
    } else {
      s <- wilcox.test(y ~ g)[["statistic"]][["W"]] # 非正态分布,使用 Mann-Whitney U 测试
    }
  } else {
    if(length(y) > 40 & any(sapply(chisq.test(y,g)$expected, function(x) x >=1))){
      s<-chisq.test(y, g)$statistic[["X-squared"]]
    } else {
      s<-fisher.test(y, g)$statistic[["X-squared"]]
    }
    # 分类变量使用卡方检验
    s <- chisq.test(y, g)$statistic[["X-squared"]]
  }
  c("",  format.pval(s, digits=3, eps=0.001))
}
#定义变量的展现形式
# rndr <- function(x, name, ...) {
#   if (!is.numeric(x)) return(render.categorical.default(x))
#   what <- switch(name,
#                  Age = "Median [Min, Max]",
#                  `Survival months` = "Median [Min, Max]"
#   )
#   parse.abbrev.render.code(c("", what))(x)
# }

#绘图
library(table1)
paste(sprintf("`%s`",colnames(df)),collapse="+")
df$Group<-c(rep("A",2),rep("B",3))
table<-table1(~`ContinuousVar1`+`ContinuousVar2`+`ContinuousVar3`+`CategoryVar1`+`CategoryVar2`+`CategoryVar3`|Group,ender=rndr,data=df,extra.col=list(`Statistics`=stat_value,`P-value`=pvalue))
复制代码
#保存为docx
library(flextable);help(package="flextable")
table_fl<-t1flex(table)
save_as_docx(table_fl,path="table.docx")
相关推荐
hh9502 小时前
gent Plan × DeepSeek Harness Agent 单元测试与行为回归框架
人工智能·数据挖掘·回归·单元测试·agent plan·adg成都社区·adg社区
ʜᴇɴʀʏ6 小时前
AAAI 2026 | KTV:基于聚类与Token剪枝的关键帧选取
数据挖掘·聚类·剪枝
这个DBA有点耶1 天前
实时数据集成工具选型2026:从CDC到数据同步的完整指南
数据库·数据挖掘·dba
2601_950760791 天前
树突状细胞亚群的分类、标志物与功能特征
人工智能·分类·数据挖掘·蛋白
慧都小项1 天前
夜间Web回归跑到一半停了?TestComplete 15.83提升批量测试稳定性
前端·测试工具·数据挖掘·回归·汽车·web
逻辑君1 天前
ANNA 意识驱动 RAG 系统
人工智能·机器学习·数据挖掘
民乐团扒谱机1 天前
【读论文】2005 一种旋律转录的分类方法A classification approach to melody transcription[C]
人工智能·分类·数据挖掘
十三画者2 天前
【文献分享】KCFtools:基于k-mer的无比对基因组变异检测与基因型矩阵构建工具
人工智能·深度学习·数据挖掘·数据分析
cspttty2 天前
会计专业大学期间考什么证
大数据·数据库·人工智能·数据挖掘
十三画者5 天前
【文献分享】ConfRetro:融合3D构象信息的逆合成预测Transformer框架
人工智能·深度学习·数据挖掘·数据分析·transformer·数据可视化