---
title: "Aberdeen hospital admissions dashboard"
output:
flexdashboard::flex_dashboard:
orientation: columns
vertical_layout: fill
source_code: embed
---
```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse)
library(lubridate)
library(DataExplorer)
library(kableExtra)
library(scales)
library(ggridges)
library(DT)
library(ggplot2)
library(plotly)
library(shiny)
```
```{r}
## load datasets from Github
hospital_adm_df <- read_csv('https://raw.githubusercontent.com/AbdnCHDS/skills-test/main/hospital_admissions.csv')
pop_dem_df <- read_csv('https://raw.githubusercontent.com/AbdnCHDS/skills-test/main/population_demographics.csv')
## Join in one db by patient 'id' using (left join)
dt <- left_join(hospital_adm_df, pop_dem_df, by = "id")
### After the dataset "summary" check, 3 things require attention.
# 1) Change the date format; 2) the time mismatch between admit and discharge;
# 3) Check NA; 4) Age distribution (typos).
dt <- dt %>%
mutate(date_admit = dmy(date_admit),
date_discharge = dmy(date_discharge))
## replace (typos) dates - 2002
dt$date_discharge <- as.Date(sub('2002', '2020', dt$date_discharge))
## calculate length hospital days
dt$hosp_length <- difftime(dt$date_discharge ,dt$date_admit , units = c("days"))
## convert as numeric value fifftime in hospital days
dt$hosp_length <- as.numeric(as.difftime(dt$hosp_length))
## replace age "typos"
dt$age <- as.numeric(sub('999','99',dt$age))
## Create two variables using the case_when function
dt$age_group <- case_when(
dt$age >= 0 & dt$age <= 13 ~ 'Children',
dt$age >= 14 & dt$age <= 17 ~ 'Young adults',
dt$age >= 18 & dt$age <= 65 ~ 'Adults',
dt$age >= 65 & dt$age <= 99 ~ 'Elderly')
dt$age_group <- as.factor(dt$age_group)
```
Part 1
=======================================================================
Column {data-width=400, .tabset}
-----------------------------------------------------------------------
### Age bar chart
```{r}
p1 <- ggplot(data= dt, aes(age, fill = factor(deprivation))) +
geom_bar() +
labs(x = "age", y = "") +
theme_light()
ggplotly(p1, height= 500, width= 700)
```
### Hospital days distribution
```{r}
p2 <- dt %>%
filter(!is.na(deprivation)) %>%
ggplot(aes(x = hosp_length, fill = factor(deprivation))) +
geom_density(alpha=0.4, position = "stack") +
theme_light()
ggplotly(p2, height= 450, width= 700)
```
Column {data-width=300}
-----------------------------------------------------------------------
### Dataset
```{r}
datatable(dt, extensions = 'Buttons',
options = list(pageLength = 15,
dom = 'Bfrtip',
buttons = c('copy','excel','print')),rownames = FALSE)
```
Part 2
=======================================================================
Column {data-width=450}
-----------------------------------------------------------------------
### boxplot distribution by age groups and days in hosp.
```{r}
p<-dt %>%
filter(!is.na(deprivation)) %>%
ggplot( aes(x = age_group, y = hosp_length, fill = age_group)) +
geom_violin(alpha = 0.5, size = .2) +
geom_jitter(alpha = .2, width = .2) +
geom_boxplot(alpha = .2) +
theme(legend.position = "none") +
labs(x = "age groups", y = "number of days in hospital")
ggplotly(p, height=500, width=700)
```
Column {data-width=300}
-----------------------------------------------------------------------
### Grouped dataset info
```{r, fig.width=50, fig.height=15}
dt1<-dt %>%
group_by(age, deprivation) %>%
summarise(tot_hosp_length = sum(hosp_length)) %>%
arrange(desc(tot_hosp_length))
datatable(dt1, extensions = 'Buttons',
options = list(pageLength = 15,
dom = 'Bfrtip',
buttons = c('copy','excel','print')),rownames = FALSE)
```