pacman::p_load(tableone, survival, flextable, officer, htmltools, htmlTable)TableOne R Package Examples
Setup
Load Data
Using Mayo Clinic’s Primary Biliary Cholangitis (PBC) data from the survival package.
data(pbc)
# Drop ID from variable list
vars <- names(pbc)[-1]
vars [1] "time" "status" "trt" "age" "sex" "ascites"
[7] "hepato" "spiders" "edema" "bili" "chol" "albumin"
[13] "copper" "alk.phos" "ast" "trig" "platelet" "protime"
[19] "stage"
str(pbc)'data.frame': 418 obs. of 20 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10 ...
$ time : int 400 4500 1012 1925 1504 2503 1832 2466 2400 51 ...
$ status : int 2 0 2 2 1 2 0 2 2 2 ...
$ trt : int 1 1 1 1 2 2 2 2 1 2 ...
$ age : num 58.8 56.4 70.1 54.7 38.1 ...
$ sex : Factor w/ 2 levels "m","f": 2 2 1 2 2 2 2 2 2 2 ...
$ ascites : int 1 0 0 0 0 0 0 0 0 1 ...
$ hepato : int 1 1 0 1 1 1 1 0 0 0 ...
$ spiders : int 1 1 0 1 1 0 0 0 1 1 ...
$ edema : num 1 0 0.5 0.5 0 0 0 0 0 1 ...
$ bili : num 14.5 1.1 1.4 1.8 3.4 0.8 1 0.3 3.2 12.6 ...
$ chol : int 261 302 176 244 279 248 322 280 562 200 ...
$ albumin : num 2.6 4.14 3.48 2.54 3.53 3.98 4.09 4 3.08 2.74 ...
$ copper : int 156 54 210 64 143 50 52 52 79 140 ...
$ alk.phos: num 1718 7395 516 6122 671 ...
$ ast : num 137.9 113.5 96.1 60.6 113.2 ...
$ trig : int 172 88 55 92 72 63 213 189 88 143 ...
$ platelet: int 190 221 151 183 136 NA 204 373 251 302 ...
$ protime : num 12.2 10.6 12 10.3 10.9 11 9.7 11 11 11.5 ...
$ stage : int 4 3 4 4 3 3 3 3 2 4 ...
Create Table 1
Create Table 1 stratified by treatment group (trt).
tableOne <- CreateTableOne(
vars = vars,
strata = c("trt"),
data = pbc,
factorVars = c("status", "edema", "stage")
)Print Table 1
Specifying nonnormal variables will show the variables appropriately and show nonparametric test p-values. Specify variables in the exact argument to obtain the exact test p-values.
print(tableOne,
nonnormal = c("bili", "chol", "copper", "alk.phos", "trig"),
exact = c("status", "stage"),
smd = TRUE,
formatOptions = list(big.mark = ",")
) Stratified by trt
1
n 158
time (mean (SD)) 2,015.62 (1,094.12)
status (%)
0 83 (52.5)
1 10 ( 6.3)
2 65 (41.1)
trt (mean (SD)) 1.00 (0.00)
age (mean (SD)) 51.42 (11.01)
sex = f (%) 137 (86.7)
ascites (mean (SD)) 0.09 (0.29)
hepato (mean (SD)) 0.46 (0.50)
spiders (mean (SD)) 0.28 (0.45)
edema (%)
0 132 (83.5)
0.5 16 (10.1)
1 10 ( 6.3)
bili (median [IQR]) 1.40 [0.80, 3.20]
chol (median [IQR]) 315.50 [247.75, 417.00]
albumin (mean (SD)) 3.52 (0.44)
copper (median [IQR]) 73.00 [40.00, 121.00]
alk.phos (median [IQR]) 1,214.50 [840.75, 2,028.00]
ast (mean (SD)) 120.21 (54.52)
trig (median [IQR]) 106.00 [84.50, 146.00]
platelet (mean (SD)) 258.75 (100.32)
protime (mean (SD)) 10.65 (0.85)
stage (%)
1 12 ( 7.6)
2 35 (22.2)
3 56 (35.4)
4 55 (34.8)
Stratified by trt
2 p test SMD
n 154
time (mean (SD)) 1,996.86 (1,155.93) 0.883 0.017
status (%) 0.884 exact 0.054
0 85 (55.2)
1 9 ( 5.8)
2 60 (39.0)
trt (mean (SD)) 2.00 (0.00) <0.001 Inf
age (mean (SD)) 48.58 (9.96) 0.018 0.270
sex = f (%) 139 (90.3) 0.421 0.111
ascites (mean (SD)) 0.06 (0.25) 0.434 0.089
hepato (mean (SD)) 0.56 (0.50) 0.069 0.206
spiders (mean (SD)) 0.29 (0.46) 0.886 0.016
edema (%) 0.877 0.058
0 131 (85.1)
0.5 13 ( 8.4)
1 10 ( 6.5)
bili (median [IQR]) 1.30 [0.72, 3.60] 0.842 nonnorm 0.171
chol (median [IQR]) 303.50 [254.25, 377.00] 0.544 nonnorm 0.038
albumin (mean (SD)) 3.52 (0.40) 0.874 0.018
copper (median [IQR]) 73.00 [43.00, 139.00] 0.717 nonnorm <0.001
alk.phos (median [IQR]) 1,283.00 [922.50, 1,949.75] 0.812 nonnorm 0.037
ast (mean (SD)) 124.97 (58.93) 0.460 0.084
trig (median [IQR]) 113.00 [84.50, 155.00] 0.370 nonnorm 0.017
platelet (mean (SD)) 265.20 (90.73) 0.555 0.067
protime (mean (SD)) 10.80 (1.14) 0.197 0.146
stage (%) 0.205 exact 0.246
1 4 ( 2.6)
2 32 (20.8)
3 64 (41.6)
4 54 (35.1)
Save as Data Frame
table1df <- as.data.frame(print(tableOne,
nonnormal = c("bili", "chol", "copper", "alk.phos", "trig"),
exact = c("status", "stage"),
smd = TRUE,
formatOptions = list(big.mark = ","),
printToggle = FALSE
))
table1df 1 2
n 158 154
time..mean..SD.. 2,015.62 (1,094.12) 1,996.86 (1,155.93)
status....
X...0 83 (52.5) 85 (55.2)
X...1 10 ( 6.3) 9 ( 5.8)
X...2 65 (41.1) 60 (39.0)
trt..mean..SD.. 1.00 (0.00) 2.00 (0.00)
age..mean..SD.. 51.42 (11.01) 48.58 (9.96)
sex...f.... 137 (86.7) 139 (90.3)
ascites..mean..SD.. 0.09 (0.29) 0.06 (0.25)
hepato..mean..SD.. 0.46 (0.50) 0.56 (0.50)
spiders..mean..SD.. 0.28 (0.45) 0.29 (0.46)
edema....
X...0.1 132 (83.5) 131 (85.1)
X...0.5 16 (10.1) 13 ( 8.4)
X...1.1 10 ( 6.3) 10 ( 6.5)
bili..median..IQR.. 1.40 [0.80, 3.20] 1.30 [0.72, 3.60]
chol..median..IQR.. 315.50 [247.75, 417.00] 303.50 [254.25, 377.00]
albumin..mean..SD.. 3.52 (0.44) 3.52 (0.40)
copper..median..IQR.. 73.00 [40.00, 121.00] 73.00 [43.00, 139.00]
alk.phos..median..IQR.. 1,214.50 [840.75, 2,028.00] 1,283.00 [922.50, 1,949.75]
ast..mean..SD.. 120.21 (54.52) 124.97 (58.93)
trig..median..IQR.. 106.00 [84.50, 146.00] 113.00 [84.50, 155.00]
platelet..mean..SD.. 258.75 (100.32) 265.20 (90.73)
protime..mean..SD.. 10.65 (0.85) 10.80 (1.14)
stage....
X...1.2 12 ( 7.6) 4 ( 2.6)
X...2.1 35 (22.2) 32 (20.8)
X...3 56 (35.4) 64 (41.6)
X...4 55 (34.8) 54 (35.1)
p test SMD
n
time..mean..SD.. 0.883 0.017
status.... 0.884 exact 0.054
X...0
X...1
X...2
trt..mean..SD.. <0.001 Inf
age..mean..SD.. 0.018 0.270
sex...f.... 0.421 0.111
ascites..mean..SD.. 0.434 0.089
hepato..mean..SD.. 0.069 0.206
spiders..mean..SD.. 0.886 0.016
edema.... 0.877 0.058
X...0.1
X...0.5
X...1.1
bili..median..IQR.. 0.842 nonnorm 0.171
chol..median..IQR.. 0.544 nonnorm 0.038
albumin..mean..SD.. 0.874 0.018
copper..median..IQR.. 0.717 nonnorm <0.001
alk.phos..median..IQR.. 0.812 nonnorm 0.037
ast..mean..SD.. 0.460 0.084
trig..median..IQR.. 0.370 nonnorm 0.017
platelet..mean..SD.. 0.555 0.067
protime..mean..SD.. 0.197 0.146
stage.... 0.205 exact 0.246
X...1.2
X...2.1
X...3
X...4
Export Options
Save as CSV
write.csv(table1df, file = "table1.csv", row.names = FALSE)Save as Word Document
table1ft <- flextable(table1df)
doc <- read_docx()
doc <- body_add_flextable(doc, value = table1ft)
print(doc, target = "table1.docx")Save as HTML File
table1html <- htmlTable::htmlTable(table1df)
save_html(table1html, file = "table1.html")
# view save_html
browseURL("table1.html")