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")
相关推荐
Sylvia33.5 天前
火星数据:解构斯诺克每一杆进攻背后的数字语言
java·前端·python·数据挖掘·数据分析
Flying pigs~~5 天前
机器学习之逻辑回归
人工智能·机器学习·数据挖掘·数据分析·逻辑回归
YangYang9YangYan5 天前
2026中专计算机专业学数据分析的实用价值分析
数据挖掘·数据分析
YangYang9YangYan5 天前
2026高职大数据管理与应用专业学数据分析的价值与前景
数据挖掘·数据分析
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
赤月奇6 天前
https改为http
数据挖掘·https·ssl
babe小鑫6 天前
高职大数据管理与应用专业学习数据分析的价值
学习·数据挖掘·数据分析
向哆哆6 天前
粉尘环境分类检测千张图数据集(适用YOLO系列)(已标注+划分/可直接训练)
yolo·分类·数据挖掘
沪漂阿龙6 天前
大模型选型决策全流程:从需求分析到生产上线的六步法
人工智能·数据挖掘·需求分析
AI前沿晓猛哥7 天前
2026最新卸载工具对比:哪个好?从功能、安全、捆绑三个维度全面评测
数据挖掘