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")
相关推荐
2603_965148111 天前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘
成为深度学习高手1 天前
CrossLinear:即插即用的跨相关嵌入,让线性模型也能用好外生变量
人工智能·python·深度学习·数据挖掘
是翎2 天前
深度长文|2026产品经理AI实践手册
人工智能·深度学习·学习·自然语言处理·数据挖掘
databook2 天前
泊松分布:从基础到实际应用
python·数据挖掘·数据分析
shujudang2 天前
业务数据分析项目中的分析方法与团队协作
大数据·数据挖掘·数据分析
成为深度学习高手2 天前
EMAformer:给Transformer披上嵌入铠甲增强时间序列预测
人工智能·深度学习·数据挖掘
sbjdhjd2 天前
从日志包含到临时文件竞争:文件包含进阶复盘中的 Docker、Windows 与 Session 限制
网络·安全·web安全·网络安全·数据挖掘·php·rce
时速GEO系统3 天前
初元 AI V1.1 版本升级,首个正式版发布一周・实现生成、部署、上线、优化全流程自动化闭环
人工智能·数据挖掘·node.js
babe小鑫3 天前
信息与计算科学专业应届生面试 怎么证明自己能解决业务问题
学习·r语言·excel
IT毕设梦工厂3 天前
计算机毕业设计选题推荐:基于大数据的城市空气污染物浓度数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·python·信息可视化·数据挖掘·数据分析·课程设计·数据可视化