系列文章目录

一、连续变量根据是否正态选择性输出mean(±sd)和median(min,max)形式


文章目录

  • 系列文章目录
  • 前言
  • 一、适用情况
  • 二、添加列
    • 1.举个例子
    • 2.代码汇总
  • 总结

前言

这一部分添加P值,其实如果更改函数有多种方法,这里为求简单引用其他文章的使用方法。这里只简单地添加t检验,方差分析、秩和检验和卡方检验的p值。
同样,先看一下效果

  代码较长,一般情况下不用自己修改前面的函数,只需修改自己的数据即可。

处理前: (未经任何修改)

处理后:


一、适用情况

  根据数据类型,样本是否正态和方差齐性以及样本量的多少确定检验方法。(统计检验方法有问题的话,请批评指正)

1.数值变量

  1)正态且方差齐,两个样本t检验,多个样本方差分析。

  2)非正态或方差不齐,秩和检验

2.分类变量: 卡方检验

暂时没有考虑结局变量是等级资料的情况。

二、添加列

1.举个例子

  下面举个例子,x为函数传进来的数据x是一个列表,每一个分类(表的顶部分类变量),对应x列表一个元素,而每个元素下面就是a数据中所有的生存状态数据(以生存状态为例)。换句话说,x是个列表,x[[1]]是所有男性的生存状态数据,x[[2]]是所有女性生存状态数据。
  先生成一般的三线表吧。这一部分是接着上一篇教程讲的,有疑惑的翻阅上一篇,或者留言即可。

rm(list = ls())
options(stringsAsFactors = F)
if (!require(table1)) {install.packages("table1")
}
library(survival)
library(car)
library(table1)#改写赋给table1中render参数的函数
rd <- function(x, name, ...){y <- a[[name]]m = any(is.na(y))if (is.numeric(y)) {normt=(shapiro.test(y)$p.value>0.1)+2my.render.cont(x,n=normt,m=m,...)}else{render.default(x=x, name=name, ...)}
}
#改写赋给table1中render.continuous参数的函数
my.render.cont <- function (x,n,m, ...) {a=with(stats.apply.rounding(stats.default(x, ...), ...), c("", `Mean (±SD)` = sprintf("%s (±%s)", MEAN, SD),`Median (Min, Max)` = sprintf("%s (%s, %s)", MEDIAN, MIN, MAX)))[-n]if (m) {a <- c(a,with(stats.apply.rounding(stats.default(is.na(x), ...), ...)$Yes,c(`Missing` = sprintf("%s (%s%%)", FREQ, PCT))))}a
}a <- lung
#新增两个数据
a$norm <- rnorm(nrow(a),10,1)
a$exp <- rexp(nrow(a))
#分类变量请设置因子、以年龄、性别、体重减低、状态为例子
a$sex <- factor(a$sex,levels = c(1,2),labels = c('男','女'))
a$status <- factor(a$status,levels = c(1,2),labels = c("存活","死亡"))#设置单位
units(a$age) <- 'year'
units(a$wt.loss) <- 'Kg'
#设置标签
label(a$norm) <- "正态分布数据"
label(a$exp) <- "指数分布数据"
label(a$status) <- "生存状态"
label(a$age) <- "年龄"
label(a$wt.loss) <- "体重减低"
label(a$sex) <- "性别"
table1(~status+age+wt.loss+norm+exp|sex,data = a,render = rd,droplevels = T,overall = F,render.continuous=my.render.cont)

  这里,我们新定义一个函数,把正态性检验的结果插入进去。看下效果。

#增加新列:正态性检验
normality <- function(x, ...) {y <- unlist(x)g <- factor(rep(1:length(x), times=sapply(x, length)))l <- length(x)if (is.numeric(y)) {#正态性检验p>0.1的水准zt <- c()for (i in 1:length(table(g))) {zt <- c(zt,shapiro.test(y[g==i])$p.value>0.1)}ztjy <- sum(zt)==length(zt)#方差齐性检验p>0.1的水准fcq <- leveneTest(y~g,center=median)$`Pr(>F)`[1]>0.1normality <- c("非正态","正态")[ztjy+1]} else {# For categorical variables, perform a chi-squared test of independencenormality <- "-"}# Format the p-value, using an HTML entity for the less-than sign.# The initial empty string places the output on the line below the variable label.#sub("<", "&lt;", format.pval(p, digits=3, eps=0.001))normality
}


(和上一篇的教程遥相呼应,这里正态性检验和资料输出呈现方式mean(sd)和median(min,max)是不是对应起来了)


2.代码汇总

  关于方差齐性检验,统计检验方法和p值结果的输出,方法和上面的相似,我就放在代码汇总里面了,方便大家提取。

rm(list = ls())
options(stringsAsFactors = F)
if (!require(table1)) {install.packages("table1")
}
library(survival)
library(car)
library(table1)#改写赋给table1中render参数的函数
rd <- function(x, name, ...){y <- a[[name]]m = any(is.na(y))if (is.numeric(y)) {normt=(shapiro.test(y)$p.value>0.1)+2my.render.cont(x,n=normt,m=m,...)}else{render.default(x=x, name=name, ...)}
}#改写赋给table1中render.continuous参数的函数
my.render.cont <- function (x,n,m, ...) {a=with(stats.apply.rounding(stats.default(x, ...), ...), c("", `Mean (±SD)` = sprintf("%s (±%s)", MEAN, SD),`Median (Min, Max)` = sprintf("%s (%s, %s)", MEDIAN, MIN, MAX)))[-n]if (m) {a <- c(a,with(stats.apply.rounding(stats.default(is.na(x), ...), ...)$Yes,c(`Missing` = sprintf("%s (%s%%)", FREQ, PCT))))}a
}#增加新列:正态性检验
normality <- function(x, ...) {y <- unlist(x)g <- factor(rep(1:length(x), times=sapply(x, length)))l <- length(x)if (is.numeric(y)) {#正态性检验p>0.1的水准zt <- c()for (i in 1:length(table(g))) {zt <- c(zt,shapiro.test(y[g==i])$p.value>0.1)}ztjy <- sum(zt)==length(zt)#方差齐性检验p>0.1的水准fcq <- leveneTest(y~g,center=median)$`Pr(>F)`[1]>0.1normality <- c("非正态","正态")[ztjy+1]} else {# For categorical variables, perform a chi-squared test of independencenormality <- "-"}# Format the p-value, using an HTML entity for the less-than sign.# The initial empty string places the output on the line below the variable label.#sub("<", "&lt;", format.pval(p, digits=3, eps=0.001))normality
}#增加新列:方差齐性检验
hom.var <- function(x, ...) {y <- unlist(x)g <- factor(rep(1:length(x), times=sapply(x, length)))l <- length(x)if (is.numeric(y)) {#正态性检验p>0.1的水准zt <- c()for (i in 1:length(table(g))) {zt <- c(zt,shapiro.test(y[g==i])$p.value>0.1)}ztjy <- sum(zt)==length(zt)#方差齐性检验p>0.1的水准fcq <- leveneTest(y~g,center=median)$`Pr(>F)`[1]>0.1hom_of_var <- c("不齐","齐")[fcq+1]} else {# For categorical variables, perform a chi-squared test of independencehom_of_var <- "-"}# Format the p-value, using an HTML entity for the less-than sign.# The initial empty string places the output on the line below the variable label.#sub("<", "&lt;", format.pval(p, digits=3, eps=0.001))hom_of_var
}#增加新列:p值
p <- function(x,result, ...) {y <- unlist(x)g <- factor(rep(1:length(x), times=sapply(x, length)))l <- length(x)if (is.numeric(y)) {#正态性检验p>0.1的水准zt <- c()for (i in 1:length(table(g))) {zt <- c(zt,shapiro.test(y[g==i])$p.value>0.1)}ztjy <- sum(zt)==length(zt)#方差齐性检验p>0.1的水准fcq <- leveneTest(y~g,center=mean)$`Pr(>F)`[1]>0.1####(正态方差齐)####if (ztjy&fcq) {if (length(table(g))>2) {# 多个样本均数的方差分析:其实两个样本的方差分析和t检验是等价的p <- summary(aov(y~g))[[1]]$`Pr(>F)`[1]p.method <- "test:ANOVA"}else{# 两个样本均数的t检验p <- t.test(y ~ g)$p.valuep.method <- "test:t"}}else{#####(非正态分布或方差不齐的多个样本)###if (length(table(g))>2) {#多个样本均数比较p <- kruskal.test(y~g)$p.value p.method <- "test:kruskal"}else{#两个样本均属比较p <- wilcox.test(y~g)$p.valuep.method <- "test:wilcox"}}}else{# For categorical variables, perform a chi-squared test of independencep <- chisq.test(table(y, g))$p.valuep.method <- "test:chi-square"}#格式化p值c(sub("<", "&lt;", format.pval(p, digits=3, eps=0.001)))}#增加新列:统计方法
pmethod <- function(x, ...) {y <- unlist(x)g <- factor(rep(1:length(x), times=sapply(x, length)))l <- length(x)if (is.numeric(y)) {#正态性检验p>0.1的水准zt <- c()for (i in 1:length(table(g))) {zt <- c(zt,shapiro.test(y[g==i])$p.value>0.1)}ztjy <- sum(zt)==length(zt)#方差齐性检验p>0.1的水准fcq <- leveneTest(y~g,center=mean)$`Pr(>F)`[1]>0.1####(正态方差齐分布)####if (ztjy&fcq) {if (length(table(g))>2) {# 多个样本均数的方差分析:其实两个样本的方差分析和t检验是等价的#p <- summary(aov(y~g))[[1]]$`Pr(>F)`[1]p.method <- "ANOVA"}else{# 两个样本均数的t检验#p <- t.test(y ~ g)$p.valuep.method <- "t"}}else{#####(非正态分布或方差不齐的多个样本)###if (length(table(g))>2) {#多个样本均数比较#p <- kruskal.test(y~g)$p.value p.method <- "Kruskal"}else{#两个样本均属比较#p <- wilcox.test(y~g)$p.valuep.method <- "Wilcox"}}} else {# For categorical variables, perform a chi-squared test of independencep <- chisq.test(table(y, g))$p.valuep.method <- "Chi-square"}p.method
}#########################分界线#############################################
####上面的部分是可以重复使用的不用变,以下部分需要你换成自己的数据并更改部分内容
############################################################################
#输入自己的数据
a <- lung
#新增两个数据(示例)
a$norm <- rnorm(nrow(a),10,1)
a$exp <- rexp(nrow(a))
#分类变量请设置因子、以年龄、性别、体重减低、状态为例子
a$sex <- factor(a$sex,levels = c(1,2),labels = c('男','女'))
a$status <- factor(a$status,levels = c(1,2),labels = c("存活","死亡"))#设置单位
units(a$age) <- 'year'
units(a$wt.loss) <- 'Kg'
#设置标签
label(a$norm) <- "正态分布数据"
label(a$exp) <- "指数分布数据"
label(a$status) <- "生存状态"
label(a$age) <- "年龄"
label(a$wt.loss) <- "体重减低"
label(a$sex) <- "性别"#原始函数出图
table1(~status+age+wt.loss+norm+exp|sex,data = a)
#修改函数后出图
table1(~status+age+wt.loss+norm+exp|sex,data = a,render = rd,droplevels = T,overall = F,render.continuous=my.render.cont,#关于新增列的名字可以自己在list()列表里面改extra.col=list(`Normality`=normality,`homogeneity of var`=hom.var,`P.method`=pmethod,`P.value`=p))

代码中有分界线,分界线下面的内容才需要修改。。(其实要改的挺少的吧)

别问,问就是首尾呼应:


总结

  说好的,国人不骗国人,今天把三线表新增列写了。虽然代码很多,但是用的时候需要修改的不多。
  下一篇:改一改三线表中简单的参数水一水吧。
   新手玩家,如有错误,请批评指正。

R语言:三线表(2)相关推荐

  1. 关于R语言和社交网络分析的几篇文章

    [转载]初学社交网络分析-<庶民的微胜利:R与社交网络分析> 关键词:igraph 图表输出 图形优化 初次尝试igraph包 igraph包入门 R语言画社交关系图 根据用户分享的歌曲, ...

  2. oracle矩阵函数,R语言矩阵matrix函数

    矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素.尽管我们可以创建只包含字符或只逻辑值的矩阵,但是它们没有多大用处.我们使用的是在数学计算中含有数字元素矩阵. 使用 matrix() ...

  3. 三线表是什么?R语言使用table1包绘制(生成)三线表、构建不分层的三线表

    三线表是什么?R语言使用table1包绘制(生成)三线表.构建不分层的三线表 目录

  4. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义函数在三线表中添加p值

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义函数在三线表中添加p值 目录

  5. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、设置transpose参数转置三线表、变量作为列,子组(strata)作为行

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.设置transpose参数转置三线表.变量作为列,子组(strata)作为行 目录

  6. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、自定义overall的标签名称

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.自定义overall的标签名称 目录

  7. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、为指定变量添加单位信息、自定义overall的标签名称

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.为指定变量添加单位信息.自定义overall的标签名称 目录

  8. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、为不同的变量显示不同的统计信息

    R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义三线表结构(将因子变量细粒度化重新构建三线图).为不同的变量显示不同的统计信息 目录

  9. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线、并将所有列居中,包括包含行标签的第一列)

    三线表是什么?R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.通过topclass参数自定义三线表表格的显示形式(显示为类似斑马线.并将所有列居中,包括包含行标签的第一列) 目录

  10. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、编写自定义函数在三线表中添加p值

    三线表是什么?R语言使用table1包绘制(生成)三线表.使用单变量分列构建三线表.编写自定义三线表结构(将因子变量细粒度化重新构建三线图).编写自定义函数在三线表中添加p值 目录

最新文章

  1. 二次重建基本完成辣!
  2. Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway
  3. 教你如何写框架------用中文构建脚本
  4. 睡眠音频分割及识别问题(七)--接口输入输出讨论
  5. 需求蔓延,常见但不正常,教你如何破
  6. 注解形式控制器(4) 数据绑定
  7. php语句导入mysql_php如何将数据库导入mysql
  8. linux 二进制安装mysql
  9. 刀片存储助力发挥融合基础架构优势
  10. Qt处理图片背景为透明色
  11. arcgis出界址点成果表_勘测定界界址点坐标成果表(TXT文件)
  12. linux拔掉网线ip仍然在,openwrt 实现网线的拔插能够释放IP和重新分配IP地址
  13. 200个计算机局域网适合什么,批处理检测局域网电脑是否开机(200多台电脑,不同网段,最好按主机名称检测)...
  14. iOS系列UI篇——UIDatePicker和UIPickerView
  15. PyTorch搭建LSTM实现时间序列预测(负荷预测)
  16. java jnlp被阻止_JNLP 被java安全阻止
  17. 直观认识Windows
  18. Ubuntu修改系统时间到北京时间的步骤
  19. python初始化一个二维数组_二维数组初始化
  20. No.5终于搞懂了kmp算法(精髓为next数组的求解过程,此文next数组未经过优化)

热门文章

  1. win7/win8卸载matlab时提示 bummer -uninstller error exeption calling main
  2. h3c路由器和三层交换机之间连接配置
  3. PHP(10):PHP读取Excel文件的记录-方法2
  4. 成纤维细胞生长因子家族介绍:(PEG-FGF/rb-bFGF/aFGF/rhaFGF/baFGF/rhKGF-2)
  5. 《图解番茄工作法》读后感
  6. LWIP轻量级TCPIP协议栈的移植
  7. Java中导出pdf文件,pdf工具类demo
  8. Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)
  9. 微信小程序的登录过程简介
  10. 如果人类没了隐私,世界会怎样?