R生成三线表
R生成三線表
- table1包
- 測試數據生成
- 制作三線表
- Tableone包
- 加載包 探索數據類型
- 數據整理分類
- 構建Table函數
- Tableone函數細節
主要基于table1 或tableone 包
table1包
測試數據生成
data=data.frame(性別=sample(c("男","女"), 1000,replace=T),年齡=round(rnorm(1000,50, 15)),民族= sample(c("漢族","壯族","其他"),1000,replace=T),身高= round(rnorm(1000,170, 5)),體重= round(rnorm(1000,75, 5)),收縮壓= round(rnorm(1000,130, 15)),舒張壓= round(rnorm(1000,90, 5)),身體狀況= sample(c("優","中","差"), 1000,replace=T),高血壓= sample(c("是","否"), 1000,replace=T),吸煙= sample(c("是","否"), 1000,replace=T),喝酒= sample(c("是","否"), 1000,replace=T) ) head(data)#運行內容性別 年齡 民族 身高 體重 收縮壓 舒張壓 身體狀況 高血壓 吸煙 喝酒 1 女 65 壯族 176 67 149 82 差 否 否 否 2 女 84 其他 177 73 137 92 差 是 是 是 3 男 75 其他 168 82 111 90 優 是 是 否 4 男 67 其他 171 76 152 93 差 是 是 否 5 男 67 壯族 172 73 118 83 優 否 否 是 6 男 44 壯族 168 82 141 83 優 是 否 是制作三線表
基本三線表, 分類變量默認以 例數(占比%),連續變量以均數(標準差)或者中位數[最小、最大]表示
pacman::p_load(table1) #加載table1包# ~ 后面接需要統計描述的列,| 表示分組 # 按是否患有高血壓分組統計 性別、年齡、民族、身高情況 table1(~性別+年齡+民族+身高|高血壓,data = data)考慮統計檢驗(卡方檢驗、t檢驗)
#———————————————————————————————————————————— 定義檢驗函數 # 這兩個主要是實現卡方檢驗和t檢驗,若是需要用到非參數檢驗、方差分析需要自己定義 pvalue <- function(x, ...) {y <- unlist(x)g <- factor(rep(1:length(x), times=sapply(x, length)))if (is.numeric(y)) {# 數值型數據用t-test(兩組比較)p <- t.test(y ~ g)$p.value } else {# 因子型數據用卡方p <- chisq.test(xtabs(~y+ g))$p.value }c("", sub("<", "<", format.pval(p, digits=3, eps=0.001)))}statistic <- function(x, ...) {y <- unlist(x)g <- factor(rep(1:length(x), times=sapply(x, length)))if (is.numeric(y)) {statistic <- t.test(y ~ g)$statistic} else {statistic <- chisq.test(xtabs(~y+ g))$statistic}c("",round(statistic,3)) }#———————————————————————————————————————————— 三線表 # 輸出帶有統計檢驗的三線表 # 分別比較是否患有高血壓兩組之間所有特征的差異~ table1(~.|高血壓,data = data, extra.col=list( 'statistic'=statistic,'P-value'=pvalue), overall=F)
table1輸出的結果格式是html格式的,可用瀏覽器打開,然后復制到word或者excel中。也直接導出保存為csv格式,導出時格式可能略微有點不同。
Tableone包
加載包 探索數據類型
pacman::p_load(tableone)#1.加載R包 rm(list = ls()) #2.清理運行環境 str(data) #3.查看數據數據性質 names(data) #4.提取變量的名字#運行內容 'data.frame': 1000 obs. of 11 variables:$ 性別 : chr "女" "女" "男" "男" ...$ 年齡 : num 65 84 75 67 67 44 50 64 44 47 ...$ 民族 : chr "壯族" "其他" "其他" "其他" ...$ 身高 : num 176 177 168 171 172 168 169 165 164 163 ...$ 體重 : num 67 73 82 76 73 82 82 79 69 83 ...$ 收縮壓 : num 149 137 111 152 118 141 131 118 123 135 ...$ 舒張壓 : num 82 92 90 93 83 83 90 91 91 91 ...$ 身體狀況: chr "差" "差" "優" "差" ...$ 高血壓 : chr "否" "是" "是" "是" ...$ 吸煙 : chr "否" "是" "是" "是" ...$ 喝酒 : chr "否" "是" "否" "否" ...> names(data) #4.提取變量的名字[1] "性別" "年齡" "民族" "身高" "體重" "收縮壓" "舒張壓" "身體狀況" "高血壓" "吸煙" "喝酒"數據整理分類
myVars的()中輸入想要在Table 1出現的變量
myVars <- c("性別","年齡","民族","身高", "體重","收縮壓", "舒張壓","身體狀況","高血壓", "吸煙","喝酒")catVars的()內指明上述中哪些是分類變量
catVars <- c("性別","民族","身體狀況","高血壓", "吸煙","喝酒")指定非正態分布連續變量變量
nonvar <- c("收縮壓","舒張壓") #此為舉例假如有T<5變量應使用Fisher精確檢驗,本文數量大,無需Fisher精確檢驗
exactvars <- c("a", "b") #此為舉例catDigits = 2, contDigits = 3, pDigits = 4,修改連續變量小數位數為2位,分類變量百分比位數為3位,調整小數位數為4位;
構建Table函數
table <- CreateTableOne(vars = myVars, #條件1factorVars = catVars,#條件2strata = "高血壓", #條件4 用于分為兩個類別data = data, #原始數據addOverall = TRUE );table#條件6加入overalltable1<- print(table, #構建的table函數(帶條件1.2.3)nonnormal = nonvar,#條件4#exact = exactvars,#條件5catDigits = 2,contDigits = 3,pDigits = 4, #附加條件showAllLevels=TRUE, #顯示所有變量quote = FALSE, # 不顯示引號noSpaces = TRUE, # #刪除用于對齊的空格printToggle = TRUE) #展示輸出結果 write.csv(table1, "E:/Rworkplace//table1.csv",row.names = F)Tableone函數細節
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.testtestExact = 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值計算僅使用分層的列陣進行。 );tabletable1<- 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。 )相比之下 table1包輸出的html格式的表格更為簡潔 好看
參考兩篇公眾號文章:
1.你的時間應該用在更重要的事情上–table1
2.R語言|4. 輕松繪制臨床基線表Table 1
總結
- 上一篇: 秦皇岛 2019 CCPC区域赛 部分代
- 下一篇: linux zynq usb0,Ubun