tableone

代码来自cloudy

数据要转换成数字 缺失数据用NA表示

rm(list = ls())

#绘制table1

#加载数据集和包

setwd("/Users/zhongyue/Desktop/R代码/统计")

rt=read.table("测试tableone.txt",header=T,sep="\t",check.names=F,row.names

= 1)

library(tableone)

# 加载包

library(survival)  #加载包,需要使用survival包的colon数据

 #加载数据集

View(rt)

tab1=CreateTableOne(data= rt);tab1  #汇总整个数据集特征


要将分类变量转化为因子


3. 分类变量处理

在数据处理中,大多数分类变量是采用数字编码,二分类变量常表示为0和1,多分类变量表示为0、1和2等。


有两种方法可以将分类变量转化为因子:一是先在数据集中将分类变量转化为因子,然后再使用tableone包进行汇总,二是在tableone包中直接指定哪些变量属于因子(使用factorVars参数进行转换),然后在进行汇总。

dput(names(rt))

# 输出rt数据集变量名称

#指定基线表中需要比较的变量

myVars <-

c("MAL2", "Age", "futime", "fustat",

"T", "N", "M", "Stage", "ER",

"PR", "HER2")

#指定基线表中哪些变量是分类变量

catVars <-

c("MAL2", "Age", "T", "N",

"M", "Stage", "ER", "PR",

"HER2","fustat")

```

4. 优化单组汇总


tab2 <-CreateTableOne(vars = myVars, 

                       data = rt,

                       factorVars =catVars);tab2

# 通过vars参数指定哪些变量是基线表中需要汇总的变量

# 通过factorVars参数指定哪些变量是分类变量

# data参数指定变量的数据来源

```

从上图可以看出,在指定基线表的汇总变量、分类变量,排除掉无关变量后,基线表的结果显示比前面好很多。


二分类变量显示为第2水平的计数(百分比),比如分类变量为0和1,则显示1的结果;如果为多分类变量,则显示出所有水平数据。


如果在表中要显示所有水平的数据,则输入:

print(tab2,

showAllLevels = TRUE)

```

注意:分类变量的百分比数据是在排除缺失值后计算的。


5. 显示基线表所有数据信息

如果需要显示所有数据信息,包括分类变量和连续变量的缺失值信息,对结果对象使用summary()函数,先输出连续变量数据信息,在输出分类变量数据信息。



summary(tab2)



6. 指定非正态分布变量

从前面的表中可以看到,连续变量都表示为均数±标准差,这是认为连续变量都呈正态分布。但是实际上有些数据呈非正态分布,需要用中位数(四分位数)表示。

假设数据集中"time"和"nodes"两个连续变量呈非正态分布。

```{r 非正态分布}

nonvar

<- c("futime") # 指定哪些变量是非正态分布变量

print(tab2,

nonnormal = nonvar) # 输出基线表数据信息

```

可以看出"time"和"nodes"这两个连续变量都用中位数(四分位数)表示了。


如果在print()函数中输入的是nonnormal = TRUE,则所有连续变量都按非正态分布进行分析。

7. 多组汇总数据

在前面,我们对数据集信息进行了单组汇总。但是通常,我们需要比较两组患者之间的基线特征,如比较AKI组和非AKI组。


在本数据集中,我们需要对"status"生存状态(1为死亡,0为删失)进行分组汇总。

```{r 分组汇总}

tab3 <-

CreateTableOne(vars = myVars,

                       strata ="MAL2",

                       data = rt,

                       factorVars = catVars);tab3

#

strata参数表示分层,指定需要分层的变量,这里我们指定status变量

# 通过vars参数指定哪些变量是基线表中需要汇总的变量。

# 通过factorVars参数指定哪些变量是分类变量

# data参数指定变量的数据来源

```


从图上我们可以看出,我们已经分组总结好了,并且在表右边已经自动进行了统计检验,输出了检验p值。


但是呈非正态分布的连续变量并没有输出中位数和四分位数,检验方法也需要调整。


8. 统计检验

如上表所示,当进行两组或多组分层汇总时,两组或多组间比较的p值会自动随着基线表一起输出,如果p值很小,则显示为<0.001。


tableone默认的检验方法为:分类变量使用卡方检验(chisq.test(),连续性校正);连续变量使用方差分析(oneway.test(),假设等方差),两组间方差分析相当于t检验。


但是在基线表中,有些连续变量是非正态分布变量,有些分类变量中单元格期望值较小,这些变量的统计方法不能使用默认的统计方法。


kruskal.test()函数可以用于呈非正态分布的连续变量,fisher.test()可以指定分类变量进行fisher精确检验。

在两组间比较时,kruskal.test()和wilcox.test()等效。


基线表的test列会显示哪些变量是使用非默认检验方法来计算p值。

假设"extent"变量需要使用fisher精确检验。


```{r 调整统计学方法}

#其他照着修改即可

exactvars <-

c("T", "N")# 指定哪些变量需要使用fisher精确检验,

print(tab3, # 前面的tab3对象

      nonnormal = nonvar, #指定哪些连续变量是非正态分布变量

      exact =exactvars)  #指定哪些变量需要使用fisher精确检验,若单独一个可以 exact = “T”

```

9. 添加overall列

如最前面的举例所示,基线表中可以添加overall列,表示所有患者的特征。

在CreateTableOne()函数中使用addOverall =

TRUE就可以添加overall列了。

```{r 添加overall列}

tab4 <-

CreateTableOne(vars = myVars,

                       strata ="MAL2",

                       data = rt,

                       factorVars = catVars,

                       addOverall = TRUE) #增加overall列

print(tab4,

nonnormal = nonvar, exact = exactvars,showAllLevels = TRUE)

#

strata表示分层,指定需要分层的变量,这里我们指定status变量

# 通过vars参数指定哪些变量是基线表中需要汇总的变量。

# 通过factorVars参数指定哪些变量是分类变量

# data参数指定变量的数据来源

```

10. 输出基线特征表

到了这一步,R中基线特征表就基本绘制完成了。接下来就要将表格导出到Excel中进行调整,然后导入到Word中绘制三线表。


简单粗暴的方法:就是复制粘贴,使用quote = TRUE显示引号,使用noSpaces = TRUE删除用于在R控制台中对齐文本的空格,然后直接复制基线表整个内容并将其粘贴到Excel电子表格即可。

简单粗暴的方法:就是复制粘贴,使用quote = TRUE显示引号,

使用noSpaces = TRUE删除用于在R控制台中对齐文本的空格,然后直接复制基线表整个内容并将其粘贴到Excel电子表格即可。

```{r 输出}

print(tab4,

# 前面的tab4对象

      nonnormal = nonvar, #指定非正态分布变量

      exact = "extent", #指定哪些变量需要使用fisher精确检验

      quote = TRUE,  #显示引号

      noSpaces = TRUE) #删除用于在R控制台中对齐文本的空格

```

另一种方式:

如果您不喜欢复制和粘贴,则可以通过以下方式自动导出。

```{r  输出}

tab4Mat <-

print(tab4, nonnormal = nonvar, exact = "extent",

                 quote = FALSE, #不显示引号

                 noSpaces = TRUE, #删除用于在R控制台中对齐文本的空格

                 printToggle =FALSE,showAllLevels = TRUE)


## 保存为CSV 格式文件,并命名为 myTable。

write.csv(tab4Mat,

file = "myTable.csv")

```

注意:quote参数选FALSE,noSpaces参数可选TRUE。


11. 后续


```{r 仅输出分类变量}

tab3$CatTable

```

```{r 仅输出连续变量}

print(tab3$ContTable,

nonnormal = nonvar)

```

12.

CreateTableOne()函数

CreateTableOne()是创建基线特征表的函数,可以汇总所有基线变量信息(包括连续变量和分类变量),并可按一个变量或多个变量进行分层汇总,并进行统计检验。


```{r 整体代码}

CreateTableOne(vars,

strata, data, factorVars,

               includeNA = FALSE,

               test = TRUE,

               testApprox = chisq.test,

               argsApprox = list(correct =TRUE),

               testExact = fisher.test,

               argsExact = list(workspace = 2 *10^5),

               testNormal = oneway.test,

               argsNormal = list(var.equal =TRUE),

               testNonNormal = kruskal.test,

               argsNonNormal = list(NULL),

               smd = TRUE, addOverall = FALSE)


函数参数解释说明

vars  #字符向量;指定哪些变量是基线特征表需要汇总的变量

# 数据集中的因子视为分类变量,数字型变量视为连续变量

# vars参数为空,则指定数据集中所有变量进行汇总


strata

# 字符向量;指定分组汇总的变量,为空则进行单组汇总(也就是Overall列)

data  #变量来源的数据集名称,所有汇总变量都要在数据集里面

factorVars

# 字符向量;指定哪些变量为分类变量,指定的变量应是vars参数中的变量

includeNA

= FALSE # 逻辑词;为TRUE则将缺失值作为因子处理,仅对分类变量有效


test =

TRUE # 逻辑词;默认为TRUE,当有2个或多个组时,自动进行组间比较

testApprox

= chisq.test # 默认卡方检验;当分类变量的单元格期望值较低(如<5)时,不建议使用

argsApprox

= list(correct = TRUE) # 进行chisq.test的连续校正。


testExact

= fisher.test # 进行精确检验的函数,默认为fisher.test。

argsExact

= list(workspace = 2*10^5) # 指定fisher.test分配的内存空间


testNormal

= oneway.test # 连续变量为正态分布进行的检验

# 默认为oneway.test,两组时相当于t检验

argsNormal

= list(var.equal = TRUE) # 假设为等方差分析


testNonNormal

= kruskal.test # 连续变量为非正态分布变量进行的检验,非参数检验

# 默认为Kruskal-Wallis秩和检验

# 当只有两个组时,与wilcox.test(Man-Whitney U检验)等效

argsNonNormal

= list(NULL) #传递给testNonNormal中指定的函数的参数的命名列表

# 默认list(NULL),它只是一个占位符


smd =

TRUE # 默认为TRUE;当有两个以上的组时,则将自动计算组间比较的标准化均值差

addOverall

= FALSE # 仅在分组汇总中使用,将overall列添加到基线表中

# smd和p值仅在分组汇总中使用。

```

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容