pacman::p_load(
flextable,
tidyverse,
dplyr,
forcats
)
pipo <- read.csv("C:/Users/thuyb/OneDrive - Universiteit Antwerpen/University of Antwerp/Semester 1/Data Management/Practice/Practical session/Practical session 5/data_visualisation_2023/3_tables/PIPO_R.csv")
sapply(pipo, function(x) sum(is.na(x)))
## WEIGHT Gender_Child LENGTH FEV1pre FVCpre AGE
## 692 62 692 694 694 692
## ID
## 0
remove(pipo_1)
## Warning in remove(pipo_1): object 'pipo_1' not found
pipo_1 <- pipo %>%
filter(!is.na(FEV1pre))
str(pipo_1)
## 'data.frame': 496 obs. of 7 variables:
## $ WEIGHT : num 25 27 26.5 34 27 27 24.5 41 26.5 26.5 ...
## $ Gender_Child: int 1 1 2 2 2 1 2 1 1 1 ...
## $ LENGTH : num 137 128 132 135 130 ...
## $ FEV1pre : num 1.74 1.89 1.74 1.94 1.67 1.72 1.77 1.91 2.1 1.53 ...
## $ FVCpre : num 2 2.21 1.98 2.18 1.81 1.89 2.17 2.31 2.32 1.86 ...
## $ AGE : num 8.67 8.51 8.96 8.44 8.39 8.47 8.35 9.31 8.24 8.22 ...
## $ ID : int 207 263 581 114 835 228 958 542 908 190 ...
pipo_1$Gender_Child <- as.factor(pipo_1$Gender_Child)
pipo_summary <- pipo_1 %>%
group_by(Gender_Child) %>%
summarise(N = n(),
FEV1_median = round(median(FEV1pre), 2),
FEV1_iqr = round(IQR(FEV1pre),2),
FVC_median = round(median(FVCpre),2),
FVC_iqr = round(IQR(FVCpre),2))
pipo_summary
## # A tibble: 2 × 6
## Gender_Child N FEV1_median FEV1_iqr FVC_median FVC_iqr
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 257 1.94 0.38 2.28 0.42
## 2 2 239 1.85 0.33 2.11 0.41
pipo_summary <- pipo_summary %>%
bind_rows(
pipo_1 %>%
summarise(N = n(),
FEV1_median = round(median(FEV1pre), 2),
FEV1_iqr = round(IQR(FEV1pre), 2),
FVC_median = round(median(FVCpre), 2),
FVC_iqr = round(IQR(FVCpre), 2)))
pipo_summary
## # A tibble: 3 × 6
## Gender_Child N FEV1_median FEV1_iqr FVC_median FVC_iqr
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 257 1.94 0.38 2.28 0.42
## 2 2 239 1.85 0.33 2.11 0.41
## 3 <NA> 496 1.89 0.36 2.18 0.43
pipo_summary <- pipo_summary %>%
mutate(Gender_Child = forcats::fct_na_value_to_level(Gender_Child, "Total"))
pipo_summary
## # A tibble: 3 × 6
## Gender_Child N FEV1_median FEV1_iqr FVC_median FVC_iqr
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 257 1.94 0.38 2.28 0.42
## 2 2 239 1.85 0.33 2.11 0.41
## 3 Total 496 1.89 0.36 2.18 0.43
Change categories of the Gender to “Boys” and “Girls” instead of 1 and 2 (1=boy, 2=girl)
pipo_summary <- pipo_summary %>%
mutate(Gender_Child=recode(Gender_Child, '1'="Boy", '2'="Girl"))
pipo_summary
## # A tibble: 3 × 6
## Gender_Child N FEV1_median FEV1_iqr FVC_median FVC_iqr
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 Boy 257 1.94 0.38 2.28 0.42
## 2 Girl 239 1.85 0.33 2.11 0.41
## 3 Total 496 1.89 0.36 2.18 0.43
?flextable
## starting httpd help server ... done
my_table <- flextable(pipo_summary)
my_table
Gender_Child | N | FEV1_median | FEV1_iqr | FVC_median | FVC_iqr |
|---|---|---|---|---|---|
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
my_table <- add_header_row(my_table, value = c("Gender", "N", "FEV1", "", "FVC1", "" ))
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Gender_Child | N | FEV1_median | FEV1_iqr | FVC_median | FVC_iqr |
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
my_table <- set_header_labels(my_table,
Gender_Child = "",
N = "",
FEV1_median = "Median",
FEV1_iqr = "IQR",
FVC_median = "Median",
FVC_iqr = "IQR")
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Median | IQR | Median | IQR | ||
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
#i’ specifies the row, ‘j’ specifies the columns and ‘part’ specifies whether you want to merge ‘headers’ or ‘body’ of the table
my_table <- my_table %>%
merge_at(i= 1, j=3:4, part = "header") %>%
merge_at(i= 1, j=5:6, part = "header") %>%
merge_at(i= 1:2, j=1, part = "header") %>%
merge_at(i= 1:2, j=2, part = "header")
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Median | IQR | Median | IQR | ||
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
my_table <- align(my_table, align = "center", part = "all")
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Median | IQR | Median | IQR | ||
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
Remove the borders (border_remove()) and add horizontal lines with hline_top, hline_bottom and hline:
my_table <- my_table %>%
border_remove() %>%
hline_top(part = "header") %>%
hline_top(part="body") %>%
hline_bottom() %>%
hline(i=2) #the second row without 2 header
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Median | IQR | Median | IQR | ||
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
my_table <- my_table %>%
fix_border_issues()
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Median | IQR | Median | IQR | ||
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
my_table <- my_table %>%
vline_left() %>%
vline_right() %>%
vline(j=c(1,2,4)) %>%
fix_border_issues()
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Median | IQR | Median | IQR | ||
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
my_table <- my_table %>%
fontsize(i = 1, size = 12, part = "header") %>% # adjust font size of major header (row 1 of header)
bold(i = 1, bold = TRUE, part = "header") %>% # adjust bold face of header (row 1 and 2 of header)
bold(i = 3, bold = TRUE, part = "body")
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Median | IQR | Median | IQR | ||
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |
my_table <- my_table %>%
bg(bg = "#9FCC4B", part = "header") %>%
bg(bg = "#F9FADE", part = "body")
my_table
Gender | N | FEV1 | FVC1 | ||
|---|---|---|---|---|---|
Median | IQR | Median | IQR | ||
Boy | 257 | 1.94 | 0.38 | 2.28 | 0.42 |
Girl | 239 | 1.85 | 0.33 | 2.11 | 0.41 |
Total | 496 | 1.89 | 0.36 | 2.18 | 0.43 |