---
title: "sjtable2df: Overview"
vignette: >
  %\VignetteIndexEntry{sjtable2df_overview}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{quarto::html}
editor_options:
  chunk_output_type: console
execute:
  eval: true
  collapse: true
  comment: "#>"
---

The [`sjPlot`](https://CRAN.R-project.org/package=sjPlot) R package is a great package for visualizing results.

However, the tables created using the functions [`sjPlot::tab_model`](https://www.rdocumentation.org/packages/sjPlot/versions/2.8.4/topics/tab_model) or [`sjPlot::tab_xtab`](https://www.rdocumentation.org/packages/sjPlot/versions/2.8.4/topics/tab_xtab) return HTML tables and are not straightforward to use in R, especially when trying to integrate them into pdf- or word-documents using Rmarkdown.

Various approaches/ tutorials exist to convert `sjPlot` HTML tables to R `data.frame` objects:

* https://stackoverflow.com/questions/63053465/how-to-convert-an-html-sjtable-from-the-sjplot-package-to-latex
* https://stackoverflow.com/questions/47744396/how-to-format-an-sjplot-in-pdf-rmarkdown
* https://stackoverflow.com/questions/62197268/knitting-output-from-sjplottab-model-or-other-html-tables-into-pdf-document
* https://stackoverflow.com/questions/65274404/how-to-extract-lme4-output-to-latex-tables

None of these approaches converts `sjPlot` HTML tables to R `data.frame` objects or integrates well with `knitr::kable` or the [`kableExtra`](https://CRAN.R-project.org/package=kableExtra) R package.

The `sjtable2df` R package's goal is to overcome this and to provide an easy interface for converting `sjPlot`'s HTML tables to `data.frame`, `data.table`, or `kable` objects for further usage in R or Rmarkdown.

Currently, `sjtable2df` provides two functions to convert tables created from `sjPlot`'s functions [`tab_model`](https://www.rdocumentation.org/packages/sjPlot/versions/2.8.4/topics/tab_model) and [`tab_xtab`](https://www.rdocumentation.org/packages/sjPlot/versions/2.8.4/topics/tab_xtab): `sjtable2df::mtab2df` and `sjtable2df::xtab2df`.

# Example: Contingency-Tables

## Data Preprocessing

```{r setup}
library(sjtable2df)
library(mlbench)

# load data
data("PimaIndiansDiabetes2")
dataset <- PimaIndiansDiabetes2 |>
  data.table::as.data.table()

# create new binary variable
dataset[, ("preg_gt_4") := ifelse(get("pregnant") > 4, 1, 0) |> factor()]
```

## Create Contingency Table

```{r}
xtab <- sjPlot::tab_xtab(
  var.row = dataset$diabetes,
  var.col = dataset$preg_gt_4,
  show.summary = TRUE,
  use.viewer = FALSE
)
```

```{r results='asis'}
xtab
```

## Convert Contingency Table to `data.frame`

```{r}
xtab_df <- sjtable2df::xtab2df(xtab = xtab, output = "data.frame")
class(xtab_df)
xtab_df
```

## Convert Contingency Table to `kable`

```{r}
xtab_kbl <- sjtable2df::xtab2df(
  xtab = xtab,
  output = "kable",
  caption = "Diabetes vs. preg>4",
  col.names = c("Diabetes", "No", "Yes", "Total")
)
class(xtab_kbl)
xtab_kbl |>
  kableExtra::add_header_above(
    header = c(" " = 1, "Pregnant > 4" = 2, " " = 1)
  )
```

## Percentages in cells

This function also extracts further statistics from cells and writes them to parentheses:

```{r}
xtab <- sjPlot::tab_xtab(
  var.row = dataset$diabetes,
  var.col = dataset$preg_gt_4,
  show.summary = TRUE,
  show.col.prc = TRUE,
  use.viewer = FALSE
)
```

```{r results='asis'}
xtab
```

## Convert Contingency Table to `data.frame`

```{r}
xtab_df <- sjtable2df::xtab2df(xtab = xtab, output = "data.frame")
xtab_df
```

# Example: Model Tables: Linear Regression

## Create Three Models

```{r}
m0 <- lm(
  pressure ~ 1,
  data = dataset
)
m1 <- lm(
  pressure ~ glucose,
  data = dataset
)
m2 <- lm(
  pressure ~ glucose + diabetes,
  data = dataset
)
```

## Create Model Table

```{r}
m_table <- sjPlot::tab_model(
  m0,
  m1,
  m2,
  show.aic = TRUE
)
```


```{r results='asis'}
m_table
```

## Convert Model Table to `data.frame`

```{r}
mtab_df <- sjtable2df::mtab2df(
  mtab = m_table,
  n_models = 3,
  output = "data.frame"
)
class(mtab_df)
mtab_df
```

## Convert Model Table to `kable`

```{r}
mtab_kbl <- sjtable2df::mtab2df(
  mtab = m_table,
  n_models = 3,
  output = "kable"
)
class(mtab_kbl)
mtab_kbl
```


# Example: Model Tables: Logistic Regression

## Create Three Models

```{r}
m0 <- stats::glm(
  diabetes ~ 1,
  data = dataset,
  family = binomial(link = "logit")
)
m1 <- stats::glm(
  diabetes ~ glucose,
  data = dataset,
  family = binomial(link = "logit")
)
m2 <- stats::glm(
  diabetes ~ glucose + pressure,
  data = dataset,
  family = binomial(link = "logit")
)
```

## Create Model Table

```{r}
m_table <- sjPlot::tab_model(
  m0,
  m1,
  m2,
  show.aic = TRUE
)
```


```{r results='asis'}
m_table
```

## Convert Model Table to `data.frame`

```{r}
mtab_df <- sjtable2df::mtab2df(
  mtab = m_table,
  n_models = 3,
  output = "data.frame"
)
class(mtab_df)
mtab_df
```

## Convert Model Table to `kable`

```{r}
mtab_kbl <- sjtable2df::mtab2df(
  mtab = m_table,
  n_models = 3,
  output = "kable"
)
class(mtab_kbl)
mtab_kbl
```



# Example: Model Tables: GLMM

## Create Three Models

```{r}
set.seed(1)
dataset$city <- sample(
  x = paste0("city_", 1:7),
  size = nrow(dataset),
  replace = TRUE
)
m0 <- lme4::glmer(
  diabetes ~ 1 + (1 | city),
  data = dataset,
  family = binomial(link = "logit")
)
m1 <- lme4::glmer(
  diabetes ~ mass + (1 | city),
  data = dataset,
  family = binomial(link = "logit")
)
m2 <- lme4::glmer(
  diabetes ~ mass + log(pressure) + (1 | city),
  data = dataset,
  family = binomial(link = "logit")
)
```

## Create Model Table

```{r}
m_table <- sjPlot::tab_model(
  m0,
  m1,
  m2,
  show.aic = TRUE
)
```


```{r results='asis'}
m_table
```

## Convert Model Table to `data.frame`

```{r}
mtab_df <- sjtable2df::mtab2df(
  mtab = m_table,
  n_models = 3,
  output = "data.frame"
)
class(mtab_df)
mtab_df
```

## Convert Model Table to `kable`

```{r}
mtab_kbl <- sjtable2df::mtab2df(
  mtab = m_table,
  n_models = 3,
  output = "kable"
)
class(mtab_kbl)
mtab_kbl
```
