#bivarate analusis install and load the package:

library(gtsummary)

#cross table

airquality %>%
  tbl_summary(
    by = Month)
Characteristic 5
N = 31
1
6
N = 30
1
7
N = 31
1
8
N = 31
1
9
N = 30
1
Ozone 18 (11, 32) 23 (20, 37) 60 (35, 80) 52 (28, 84) 23 (16, 36)
    Unknown 5 21 5 5 1
Solar.R 194 (66, 290) 189 (127, 273) 253 (175, 274) 198 (99, 233) 192 (112, 236)
    Unknown 4 0 0 3 0
Wind 11.5 (8.6, 14.3) 9.7 (8.0, 11.5) 8.6 (6.9, 10.9) 8.6 (6.3, 11.5) 10.3 (7.4, 12.6)
Temp 66 (59, 69) 78 (76, 83) 84 (81, 86) 82 (79, 89) 76 (71, 81)
Day 16 (8, 24) 16 (8, 23) 16 (8, 24) 16 (8, 24) 16 (8, 23)
1 Median (Q1, Q3)
NA

##common statistics

airquality %>%
  tbl_summary(
    by = Month,
    statistic = list(
      all_continuous() ~ "{mean} ({sd})",
      all_categorical() ~ "{n} / {N} ({p}%)"
    )
  )
Characteristic 5
N = 31
1
6
N = 30
1
7
N = 31
1
8
N = 31
1
9
N = 30
1
Ozone 24 (22) 29 (18) 59 (32) 60 (40) 31 (24)
    Unknown 5 21 5 5 1
Solar.R 181 (115) 190 (93) 216 (81) 172 (77) 167 (79)
    Unknown 4 0 0 3 0
Wind 11.6 (3.5) 10.3 (3.8) 8.9 (3.0) 8.8 (3.2) 10.2 (3.5)
Temp 66 (7) 79 (7) 84 (4) 84 (7) 77 (8)
Day 16 (9) 16 (9) 16 (9) 16 (9) 16 (9)
1 Mean (SD)
NA
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojYml2YXJhdGUgYW5hbHVzaXMNCmluc3RhbGwgYW5kIGxvYWQgdGhlIHBhY2thZ2U6DQpgYGB7cn0NCmxpYnJhcnkoZ3RzdW1tYXJ5KQ0KDQpgYGANCmBgYHtyfQ0KYGBgDQojY3Jvc3MgdGFibGUNCg0KYGBge3J9DQphaXJxdWFsaXR5ICU+JQ0KICB0Ymxfc3VtbWFyeSgNCiAgICBieSA9IE1vbnRoKQ0KDQpgYGANCiMjY29tbW9uIHN0YXRpc3RpY3MNCg0KYGBge3J9DQphaXJxdWFsaXR5ICU+JQ0KICB0Ymxfc3VtbWFyeSgNCiAgICBieSA9IE1vbnRoLA0KICAgIHN0YXRpc3RpYyA9IGxpc3QoDQogICAgICBhbGxfY29udGludW91cygpIH4gInttZWFufSAoe3NkfSkiLA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAie259IC8ge059ICh7cH0lKSINCiAgICApDQogICkNCg0KYGBgDQoNCg==