轻松绘制临床基线表Table 1

Table 1是总结研究样本中变量组成及变量间关系的一张表。
R语言可以通过几行代码快速生成Table 1。
本期用到的是“tableone”,是我制作Table 1时最喜欢用的包

欢迎大家关注我的公众号:一只勤奋的科研喵

原文链接:R语言轻松绘制临床基线表Table 1

R语言统计与绘图

目录

一. 文献中的Tabl 1

二. tableone包制作Table 1(2列)

三. tableone包制作Table 1(4列)

四. tableone包制作Table 1(5列)

五. tableone其他代码展示
分割线

一、文献中的Table 1
图片来自:https://www.jianshu.com/p/3328fd0689f2

连续和分类变量相关性检验见:连续变量相关性比较分类变量相关性检验

类型1. 变量名+总人群(两列)
研究目的为“xx疾病的预后因素分析”时常用,即不涉及比较。
这种表只需把握好连续变量为正态还是非正态分布即可。正态分布写均值±标准差,非正态分布写中位数+上下四分位数。分类变量写数目和百分数。

例:研究某类型乳腺癌的预后,所以Table 1两列
参考文献:Lewis GD,et al. Prognosis of lymphotropic invasive micropapillary breast carcinoma analyzed by using data from the National Cancer Database. Cancer Commun (Lond). 2019 Oct 21;39(1):60.

类型2:变量+某变量分列+p值
研究目的为 “xx变量对预后的比较分析” 时常用。
因涉及比较,所以在Table 1常将用该变量将全部人群分为几类,观察其他变量在这几个分类中是否有差异(p值)。
这种表就涉及到了连续变量和分类变量的相关性检验

下面这篇文章的目的是研究两种病理类型的乳腺癌临床病理特点的比较。Table 1中作者总结了出这两个病理类型在肿瘤位置、组织分级等变量中有何差异
参考文献:Yu JI,et al. Differences in prognostic factors and patterns of failure between invasive micropapillary carcinoma and invasive ductal carcinoma of the breast: matched case-control study. Breast. 2010 Jun;19(3):231-7.

类型3. 变量名+总数+某变量分组+p值
1和2的综合。可以向读者展示更多细节。通常5列。

文章目的是两种病理类型的乳腺癌临床病理特点的比较。
参考文献:Hashmi AA, et al. Clinicopathologic features of invasive metaplastic and micropapillary breast carcinoma: comparison with invasive ductal carcinoma of breast. BMC Res Notes. 2018 Jul 31;11(1):531.

二、tableone包制作Table 1(2列)#

以下数据来自SEER数据库的5000例乳腺癌病例。
过程其实就是输入3个条件【指定需要汇报的变量;指定这些变量中的分类变量;指定哪些连续变量是非正态分布】-----构建函数-----输出表格

1、安装R包、数据放入工作目录

#install.packages("tableone") #1.加载R包,电脑里若无tableone,去掉下面的#
library(tableone)
rm(list = ls()) #2.清理运行环境
aa<- read.csv('20210126.csv') #3.读入数据

2、查看数据构成

head(aa) #查看数据前6行
源数据尽量用英文单词或缩写而非0.1.2.3.4代替。因软件默认识别为连续变量,需要转换,很麻烦。用英文在整理表格时也方便,省时省力。
str(aa) #查看数据数据性质
数据有5000病例;16变量,2连续变量(年龄和时间);14分类变量及它们亚变量的个数和名字。
names(aa) #提取变量的名字

age=年龄,age70=以70岁为界分组的年龄,race=种族,marry=婚姻,t=t分期,n=n分期,tnm=tnm分期,er=雌激素受体,pr=孕激素受体,her2,g=组织分级,sur=手术,rt=放疗,che=化疗,status=死亡否,time=时间
7.png

3、连续变量正态性检验

shapiro.test(aa$age) #p>0.05才符合正态分布
shapiro.test(aa$time) #p>0.05才符合正态分布
age和time SW检验p&lt;0.05, 不符合正态性分布,Table1应汇报中位数+四分位数

前面的代码是只是查看数据性质,从第4步开始正式写Table 1代码。

4、输入Table 1的条件
条件1# myVars的()中输入想要在Table 1出现的变量【英文引号以英文逗号隔开】

myVars <-c ("age","age70","race","marry","t", "n", "tnm", "er", "pr", "g","her2", 
                      "sur","rt","che",  "time","status")#16个变量

条件2# catVars的()内指明上述中哪些是分类变量

catVars <- c("age70","race", "marry", "t", "n", "tnm", "er", "pr","g","her2", 
                    "sur","rt","che", "status")#14个分类变量

条件3# tableone包默认输出均数+标准差,所以nonvar的()输入那些连续变量是非正态分布的(输出中位数+四分位数)

onvar <- c("time","age")  # 指定哪些变量是非正态分布变量

5、构建Table 函数 CreateTableOne()

table<- CreateTableOne(vars = myVars,#条件1
                                       factorVars = catVars,#条件2
                                        data = aa, #源数据
                                        addOverall = TRUE) #增加overall列

6、输出结果

table1 <- print(table, #构建的table函数(包括条件1.2)
                       showAllLevels=TRUE, #显示所有变量
                        nonnormal = nonvar) #条件3
age和time均汇报为中位数+四分位数,分类变量均汇报为数目加百分数

7、保存至Excel

write.csv(table1, file = "table1.csv")
11.png

三、tableone包制作Table 1(4列)

4列的Table 1其实就是在构建table 1时加入了一个变量分列条件而已。需要注意的是此时应先验证连续变量和分类是哪种检验方法。
详见:连续变量相关性比较分类变量检验

前面操作1-4步不变

library(tableone) *#1.加载R包*`
rm(list = ls()) *#2.清理运行环境*`
aa<- read.csv('20210126.csv') *#3.读入数据*`
head(aa) *#4.查看数据前6行*`
str(aa) *#5.查看数据数据性质*`
names(aa) *#6.提取变量的名字*`

条件1不变 myVars的()中输入想要在Table 1出现的变量

myVars <- c("age","age70","race","marry", "t","n", "tnm","er","pr", 
                   "g","her2", "sur","rt","che","time","status") #16变量

条件2不变 catVars的()内指明上述中哪些是分类变量

catVars <- c("age70","race", "marry", "t", "n", "tnm", "er", "pr","g","her2", 
                    "sur","rt","che","status")

5、构建Table函数

构建table 函数,加入条件4,strata = " " 。英文引号内填入需要分列的变量,例如本研究想探索放疗对预后的影响,则为strata = "rt"

table <- CreateTableOne(vars = myVars, *#条件1*
                                        factorVars = catVars,*#条件2*
                                        strata = "rt", *#条件4*
                                        data = aa, *#原始数据*
                                         );table

条件3不变 指定非正态分布连续变量变量

nonvar <- c("time","age") 

条件5新加入 假如有T<5变量应使用Fisher精确检验,本文数量大,无需Fisher精确检验

exactvars <- c("a", "b")

附加细节:catDigits = 2, contDigits = 3, pDigits = 4,修改连续变量小数位数为2位,分类变量百分比位数为3位,调整小数位数为4位;

6、输出结果

把构建的table+条件1-5+附加细节条件放入print()函数

table1<- print(table, #构建的table函数(带条件1.2.3)
nonnormal = nonvar,#条件4
#exact = exactvars, #条件5
catDigits = 2,contDigits = 3,pDigits = 4, #附加条件
showAllLevels=TRUE, #显示所有变量
quote = FALSE, # 不显示引号
noSpaces = TRUE, # #删除用于对齐的空格
printToggle = TRUE) #展示输出结果*`
13.png

四、tableone包制作Table 1(5列)

制作4列的所有条件不变(1-5+附加条件),在构建table函数时的代码增加一个addOverall = TRUE

5、构建Table函数

table <- CreateTableOne(vars = myVars, #条件1
                                       factorVars = catVars,#条件2
                                       strata = "rt", #条件4
                                       data = aa, #原始数据
                                      addOverall = TRUE
                                       );table#条件6加入overall

6、输出Table 1(代码不变)

table1<- print(table, #构建的table函数(带条件1.2.3)
                      nonnormal = nonvar,#条件4
                      #exact = exactvars,#条件5
                      catDigits = 2,contDigits = 3,pDigits = 4, #附加条件
                      showAllLevels=TRUE, #显示所有变量
                      quote = FALSE, # 不显示引号
                      noSpaces = TRUE, # #删除用于对齐的空格
                      printToggle = TRUE) #展示输出结果
15.png

五、tableone包其他细节

函数CreateTableOne()所以细节条件汇总,即第5步。

5、构建Table函数

table <- CreateTableOne( vars, #指定哪些变量是Table 1需要汇总的变量
                         strata,#指定进行分类的变量,不写则只出Overall列
                         data,# 变量的数据集名称
                         factorVars,#指定哪些变量为分类变量,指定的变量应是vars参数中的变量
                         includeNA = FALSE,#为TRUE则将缺失值作为因子处理,仅对分类变量有效
                         test = TRUE,#默认为TRUE,当有2个或多个组时, 自动进行组间比较
                         testApprox = chisq.test,#默认卡方检验
                         argsApprox = list(correct = TRUE),# 进行连续校正的chisq.test
                         testExact = fisher.test,#进行fisher精确检验
                         argsExact = list(workspace = 2 * 10^5),# 指定 
                         fisher.test分配的内存空间
                         testNormal = oneway.test, # 连续变量为正态分布进行的检验,默认为 oneway.test,两组时相当于t检验
                         argsNormal = list(var.equal = TRUE), # 假设为等方差分析
                         testNonNormal = kruskal.test,# 默认为Kruskal-Wallis秩和检验
                         argsNonNormal = list(NULL),#传递给testNonNormal中指定的函数的参数的名列表
                          smd = TRUE,#如果为TRUE(如默认值)并且有两个以上的组,则将计算所有成对比较的标准化均值差。
                          addOverall = FALSE#仅在分组时使用)将整个列添加到表中。Smd和p值计算仅使用分层的列阵进行。
);table

print()函数细节汇总,即第6步
6、输出Table 1

table1<- print(x, #CreateTableOne()的 <- 前的名字(x=table)
                         catDigits = 1, #连续变量小数位1位
                         contDigits = 2,#分类变量保留2位
                         pDigits = 3,#p值保留3位
                         quote = FALSE,#默认值为FALSE。如果为TRUE#则包括行名                         和列名在内的所有内容都用引号引起来,以便您可以轻松地将其复制到Excel。
                         missing = FALSE,#是否显示丢失的数据信息
                         explain = TRUE,#显示百分比时是否在变量名称中添加解释,即(%)添加到变量名称中。
                         printToggle = TRUE,#如果为FALSE,则不输出
                         test = TRUE,#是否显示p值。默认为TRUE。
                         smd = FALSE,#是否显示标准化均值差异。默认为FALSE。如果存在多个对比,则显示所有可能的标准化均值差的平均值。
                         noSpaces = FALSE,#是否删除为对齐而添加的空格。
                         padColnames = FALSE,#是否用空格填充列名以居中对齐。默认值为FALSE。如果noSpaces = TRUE,则不进行
                         varLabels = FALSE,#是否用从labelled :: var_label()函数获得的变量标签替换变量名。
                         format = c("fp", "f", "p", "pf")[1],#默认值为“ fp”频率(百分比)。您也可以选择仅“ f”频率,“仅p”百分比和“ pf”百分比(频率)。
                         showAllLevels = FALSE,#是否显示所有级别。
                         cramVars = NULL,#字符向量,用于指定两个级别的分类变量,对于这两个级别的变量,应在一行中显示两个级别。
                         dropEqual = FALSE,#是否删除“ =第二级名称”描述,指示为两级分类变量显示哪个级别。
                         exact = NULL,#字符向量,用于指定p值应为精确测试值的变量。
                         nonnormal = NULL,#字符向量,用于指定p值应为非参数检验的变量的变量。
                         minMax = FALSE#对于非正态变量,是否使用[min,max]而不是[p25,p75]。默认值为FALSE。
)

—— 完 ——

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

推荐阅读更多精彩内容