A function that creates tables
create_table <- function(dataset, var){
table(dataset[var]) |>
knitr::kable()
}
The function above uses the table() function to create
frequency tables, and then this gets passed to the
knitr::kable() function that produces a good looking table
for our rendered document:
create_table(mtcars, "am")
Let’ suppose that we want to generate a document that would look like
this:
- first a section title, with the name of the variable of
interest
- then the table
So it would look like this:
Frequency table for variable: “am”
create_table(mtcars, "am")
We don’t want to create these sections for every variable by
hand.
Instead, we can define a function that returns the R markdown code
required to create this. This is this function:
return_section <- function(dataset, var){
a <- knitr::knit_expand(text = c("## Frequency table for variable: {{variable}}",
create_table(dataset, var)),
variable = var)
cat(a, sep = "\n")
}
This new function, return_section() uses
knitr::knit_expand() to generate R Markdown code. Words
between {{}} get replaced by the provided var
argument to the function. So when we call
return_section("am"), {{variable}} is replaced
by "am". "am" then gets passed down to
create_table() and the frequency table gets generated. We
can now generate all the section by simply applying our function to a
list of column names:
invisible(lapply(colnames(mtcars), return_section, dataset = mtcars))
Frequency table for variable: mpg
| 10.4 |
2 |
| 13.3 |
1 |
| 14.3 |
1 |
| 14.7 |
1 |
| 15 |
1 |
| 15.2 |
2 |
| 15.5 |
1 |
| 15.8 |
1 |
| 16.4 |
1 |
| 17.3 |
1 |
| 17.8 |
1 |
| 18.1 |
1 |
| 18.7 |
1 |
| 19.2 |
2 |
| 19.7 |
1 |
| 21 |
2 |
| 21.4 |
2 |
| 21.5 |
1 |
| 22.8 |
2 |
| 24.4 |
1 |
| 26 |
1 |
| 27.3 |
1 |
| 30.4 |
2 |
| 32.4 |
1 |
| 33.9 |
1 |
Frequency table for variable: cyl
Frequency table for variable: disp
| 71.1 |
1 |
| 75.7 |
1 |
| 78.7 |
1 |
| 79 |
1 |
| 95.1 |
1 |
| 108 |
1 |
| 120.1 |
1 |
| 120.3 |
1 |
| 121 |
1 |
| 140.8 |
1 |
| 145 |
1 |
| 146.7 |
1 |
| 160 |
2 |
| 167.6 |
2 |
| 225 |
1 |
| 258 |
1 |
| 275.8 |
3 |
| 301 |
1 |
| 304 |
1 |
| 318 |
1 |
| 350 |
1 |
| 351 |
1 |
| 360 |
2 |
| 400 |
1 |
| 440 |
1 |
| 460 |
1 |
| 472 |
1 |
Frequency table for variable: hp
| 52 |
1 |
| 62 |
1 |
| 65 |
1 |
| 66 |
2 |
| 91 |
1 |
| 93 |
1 |
| 95 |
1 |
| 97 |
1 |
| 105 |
1 |
| 109 |
1 |
| 110 |
3 |
| 113 |
1 |
| 123 |
2 |
| 150 |
2 |
| 175 |
3 |
| 180 |
3 |
| 205 |
1 |
| 215 |
1 |
| 230 |
1 |
| 245 |
2 |
| 264 |
1 |
| 335 |
1 |
Frequency table for variable: drat
| 2.76 |
2 |
| 2.93 |
1 |
| 3 |
1 |
| 3.07 |
3 |
| 3.08 |
2 |
| 3.15 |
2 |
| 3.21 |
1 |
| 3.23 |
1 |
| 3.54 |
1 |
| 3.62 |
1 |
| 3.69 |
1 |
| 3.7 |
1 |
| 3.73 |
1 |
| 3.77 |
1 |
| 3.85 |
1 |
| 3.9 |
2 |
| 3.92 |
3 |
| 4.08 |
2 |
| 4.11 |
1 |
| 4.22 |
2 |
| 4.43 |
1 |
| 4.93 |
1 |
Frequency table for variable: wt
| 1.513 |
1 |
| 1.615 |
1 |
| 1.835 |
1 |
| 1.935 |
1 |
| 2.14 |
1 |
| 2.2 |
1 |
| 2.32 |
1 |
| 2.465 |
1 |
| 2.62 |
1 |
| 2.77 |
1 |
| 2.78 |
1 |
| 2.875 |
1 |
| 3.15 |
1 |
| 3.17 |
1 |
| 3.19 |
1 |
| 3.215 |
1 |
| 3.435 |
1 |
| 3.44 |
3 |
| 3.46 |
1 |
| 3.52 |
1 |
| 3.57 |
2 |
| 3.73 |
1 |
| 3.78 |
1 |
| 3.84 |
1 |
| 3.845 |
1 |
| 4.07 |
1 |
| 5.25 |
1 |
| 5.345 |
1 |
| 5.424 |
1 |
Frequency table for variable: qsec
| 14.5 |
1 |
| 14.6 |
1 |
| 15.41 |
1 |
| 15.5 |
1 |
| 15.84 |
1 |
| 16.46 |
1 |
| 16.7 |
1 |
| 16.87 |
1 |
| 16.9 |
1 |
| 17.02 |
2 |
| 17.05 |
1 |
| 17.3 |
1 |
| 17.4 |
1 |
| 17.42 |
1 |
| 17.6 |
1 |
| 17.82 |
1 |
| 17.98 |
1 |
| 18 |
1 |
| 18.3 |
1 |
| 18.52 |
1 |
| 18.6 |
1 |
| 18.61 |
1 |
| 18.9 |
2 |
| 19.44 |
1 |
| 19.47 |
1 |
| 19.9 |
1 |
| 20 |
1 |
| 20.01 |
1 |
| 20.22 |
1 |
| 22.9 |
1 |
Frequency table for variable: vs
Frequency table for variable: am
Frequency table for variable: gear
Frequency table for variable: carb
| 1 |
7 |
| 2 |
10 |
| 3 |
3 |
| 4 |
10 |
| 6 |
1 |
| 8 |
1 |