rmarkdown: kable, xtable or tab_df tables in Word doc - r

---
output:
word_document: default
---
```{r setup, include=FALSE}
data("mtcars")
library(tidyverse)
library(xtable)
library(sjPlot)
library(kableExtra)
```
```{r, results='asis'}
df <- mtcars %>%
group_by(cyl) %>%
summarise(disp = mean(disp),
wt = mean(wt),
n = n()
)
kable(df)
# tab_df(df)
# xtable(df)
```
I have tried xtable, tab_df, and kable to generate a word document with a table. When "knit to HTML document", all tables looked fine. When "knit to Word", xtable didn't show the table while tab_df and kable produced a table with only one column:
kable(df)
cyl
disp
wt
n
4
105.1364
2.285727

I experimented with flextable quite a bit the last few days and it might be the best option when you have to work with Word:
---
output:
word_document: default
---
```{r setup, include=FALSE}
data("mtcars")
library(tidyverse)
library(flextable)
```
```{r, results='asis'}
mtcars %>%
group_by(cyl) %>%
summarise(disp = mean(disp),
wt = mean(wt),
n = n()
) %>%
flextable() %>%
align(part = "all") %>% # left align
set_caption(caption = "Table 1: Example") %>%
font(fontname = "Calibri (Body)", part = "all") %>%
fontsize(size = 10, part = "body") %>%
# add footer if you want
# add_footer_row(values = "* p < 0.05. ** p < 0.01. *** p < 0.001.",
# colwidths = 4) %>%
theme_booktabs() %>% # default theme
autofit()
```

Related

produce contingency table in rmarkdown using kable

I am trying to produce a well formatted contingency table in an rmarkdonw html document. Here is the code:
---
title: "Probabilidad"
author: "Nicolás Molano Gonzalez"
date: "7 de Abril de 2020"
output:
html_document:
fig_caption: true
---
```{r echo=F, message = FALSE, warning =F}
library(tidyverse)
library(kableExtra)
library(knitr)
set.seed(150)
```
this the data for the table:
```{r echo=FALSE, results = 'asis'}
ca_ctr_r<-.3
n <- 250
nCA <- round(n*ca_ctr_r)
z0 <- data.frame(status=c(rep("CA",nCA),rep("CTR",n-nCA)))
z0$exposition <- NA
exp_CA <- .45
exp_CTR <- .19
z0[z0$status %in% "CA","exposition"] <- ifelse(runif(nCA) < exp_CA,"yes","no")
z0[z0$status %in% "CTR","exposition"] <- ifelse(runif(n-nCA) < exp_CA,"yes","no")
z0$exposition <- factor(z0$exposition,levels = c("yes","no"))
```
here is the code to print the contingency table, which should be improved.
```{r echo=FALSE, results = 'asis'}
res <- kable(t(table(z0)%>%addmargins))
#res <- kable(t(table(z0)))
kable_styling(res,"striped", position = "center",full_width = F) %>% add_header_above(c("exposition","status"=2," "))
```
I want the output of the code to be similar to that of base R namely:
status
exposition CA CTR Sum
no 40 96 136
yes 35 79 114
Sum 75 175 250
add_header_above lets me get the title for the columns but I am struggling to achieve the title for the rows (exposition) in the right position.
I tried a workaround by explicitly adding a column to the left of the table before passing it to kable.
library(tidyverse)
library(kableExtra)
library(knitr)
cont.table = mtcars %>% select(gear, carb) %>%
group_by_all() %>% tally() %>%
spread(key = gear, value = n)
cont.table %>%
rename("\t" = carb) %>%
add_column(" " = c("carb", rep(" ", nrow(.) - 1)), .before = "\t") %>%
kable() %>%
kable_styling(position = "left", full_width = F, ) %>%
add_header_above(c("", "", "gear", rep(" ", ncol(cont.table) - 2))) %>%
column_spec(1:2, bold = TRUE)

How to display R data frame in generated PowerPoint

---
title: "Untitled"
output: powerpoint_presentation
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```
## Table
```{r table, echo=FALSE, message=FALSE, warning=FALSE}
library(tidyverse)
library(kableExtra)
mtcars %>%
count(cyl) %>%
ungroup() # %>%
# kable() %>%
# kable_styling()
```
I'm working off the repro above. I'd like to present the mtcars calculated data frame in a kable or kableExtra fashion, like this:
Instead the table outputs in the following console format:
## # A tibble: 3 x 2
## cyl n
## <dbl> <int>
## 1 4 11
## 2 6 7
## 3 8 14
How do I make my R PowerPoint tables pretty, and even better, editable in PowerPoint?
You can use flextable package. It's support powerpoint_presentation output with R Markdown. You will find below an example :
---
title: "Untitled"
output: powerpoint_presentation
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```
## Table
```{r table, echo=FALSE, message=FALSE, warning=FALSE}
library(magrittr)
library(flextable)
mtcars[1:5,1:4] %>%
tibble::rownames_to_column() %>%
flextable() %>%
set_header_labels(rowname = "") %>%
add_header_row(values = c("", "Group 1", "Group 2"),
colwidths = c(1, 2, 2)) %>%
theme_zebra() %>% autofit()
```

Add "greater than and equal" symbol on latex table using kable and group_rows

As title, I am trying to use the group_rows function to tidy up my table as shown below, I have add the <= symbol at column 5 (i.e. <=rowid), but the symbol cannot be shown correctly when the column is used for group_rows, can anyone help? Thanks!
---
output:
pdf_document:
keep_tex: true
header-includes:
- \usepackage{colortbl}
- \usepackage{tikz}
papersize: a4
editor_options:
chunk_output_type: console
---
```{r setup, include=FALSE}
library(dplyr)
library(knitr)
library(kableExtra)
knitr::opts_chunk$set(warning=FALSE, message=FALSE, echo=FALSE)
options(kableExtra.latex.load_packages = FALSE)
```
```{r cars, results='asis'}
data.df <- iris %>%
data.frame %>%
group_by(Species) %>%
filter(row_number()<=3) %>%
mutate(rowid=1:n()) %>%
ungroup %>%
mutate(Species=as.character(Species)) %>%
mutate(Species=paste0('$\\geq$',Species)) %>%
mutate(rowid=paste0('$\\geq$',rowid)) %>%
rename('$\\geq$rowid'='rowid')
data.df %>%
select(-Species) %>%
kable(.,format = 'latex',booktabs=TRUE,escape = FALSE,longtable=TRUE) %>%
group_rows(index = auto_index(data.df$Species)) %>%
kable_styling(latex_options = c('repeat_header','striped','HOLD_position'))
```
The grouped row headers are put inside \textbf{} statement and somehow, extra text sanitation is done in the process. If you use escape = T inside group_rows and add extra backslashes it works:
data.df <- iris %>%
data.frame %>%
group_by(Species) %>%
filter(row_number()<=3) %>%
mutate(rowid=1:n()) %>%
ungroup %>%
mutate(Species=as.character(Species)) %>%
mutate(Species=paste0('$\\\\geq$', Species)) %>% # extra backslashes
mutate(rowid=paste0('$\\geq$',rowid)) %>%
rename('$\\geq$rowid'='rowid')
data.df %>%
select(-Species) %>%
kable(., format = 'latex', booktabs=TRUE, escape = FALSE, longtable=TRUE) %>%
group_rows(index = auto_index(data.df$Species), escape = F) %>% # escape = F
kable_styling(latex_options = c('repeat_header','striped','HOLD_position'))

Using shiny render functions in a magrittr pipeline such as renderTable renderPlot inside html_notebook with shiny runtime

Is it possible to use the shiny::render* family of functions at the end of a pipeline %>%? Specifically, when using an html_notebook with a runtime: shiny.
Instead of: renderTable({mtcars[1:5, ]}) is it possible to do something like: mtcars[1:5, ] %>% renderTable()?
Example
---
title: "R Notebook"
output: html_notebook
runtime: shiny
---
This is an [R Markdown](http://rmarkdown.rstudio.com) Notebook. When you execute code within the notebook, the results appear beneath the code.
```{r echo=FALSE, warning=FALSE, message=FALSE}
library(tidyverse)
renderTable({
mtcars[1:5, ]
})
```
```{r echo=FALSE}
renderTable({
mtcars %>%
filter(cyl == 4) %>%
group_by(am) %>%
summarise(avg_gear = mean(gear),
sd_carb = sd(carb))
})
# NOTE: This does not work!
mtcars %>%
filter(cyl == 4) %>%
group_by(am) %>%
summarise(avg_gear = mean(gear),
sd_carb = sd(carb)) %>%
renderTable()
```
mtcars %>%
filter(cyl == 4) %>%
group_by(am) %>%
summarise(avg_gear = mean(gear),
sd_carb = sd(carb)) %>%
renderTable(quoted = TRUE) # quoted defaults to FALSE

Combining cells in R, LaTex

Can I have two summary statistics in one cell in R-generated LaTex tables? I'm using the tables package and I'd like to summarize a column as mean (sd). Here's a reproducible example in rmarkdown.
---
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tables)
library(dplyr)
```
```{r table, results='asis'}
seed <- 1
iris2 <- iris %>% mutate(Region = factor(sample(c('East', 'West', 'Central'), 150, replace = TRUE)))
tabular((Species + 1) ~ (Region + 1) * Sepal.Length * (mean + sd),
data = iris2) %>%
latex %>%
print
```
The output looks like this:
But I want the cells to look like e.g. 5.037 (0.3041). Is that possible?
You can probably do something you want using paste()
E.g.:
paste(round(mean[1], digits=3), "(", sd[1], ")", collapse="")
The Paste pseudo-function does the trick, but introduces unnecessary padding (see: Remove padding from pasted cells in LaTex, R). Example code:
---
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tables)
library(dplyr)
```
```{r table, results='asis'}
seed <- 1
iris2 <- iris %>% mutate(Region = factor(sample(c('East', 'West', 'Central'), 150, replace = TRUE)))
tabular((Species + 1) ~ (Region + 1) * Sepal.Length * Paste(Percent(), length, sep = '\\% (', postfix = ')'),
data = iris2) %>%
latex %>%
print
```

Resources