kableExtra, knitr::kable()
함수는 통해 R마크다운 문서에 포함되는 표를 원하는 방향으로 작성할 수 있다.
R마크다운 표 기능을 시연하는데 mtcars
데이터프레임을 기본 데이터로 많이 사용한다.
mtcars
데이터프레임에서 시연목적으로 관측점 5개와 열 4개를 뽑아내서 kable()
함수에 넣고 출력형식을 markdown
으로 지정한다. markdown
외에도 html
, pandoc
, latex
, rst
등이 있다.
library(tidyverse)
library(knitr)
mtcars %>%
sample_n(5) %>%
select(mpg, cyl, disp, hp) %>%
kable("markdown")
mpg | cyl | disp | hp | |
---|---|---|---|---|
Datsun 710 | 22.8 | 4 | 108.0 | 93 |
Camaro Z28 | 13.3 | 8 | 350.0 | 245 |
Merc 240D | 24.4 | 4 | 146.7 | 62 |
Fiat 128 | 32.4 | 4 | 78.7 | 66 |
Duster 360 | 14.3 | 8 | 360.0 | 245 |
kable()
함수 내부에 col.names =
에 칼럼명을 넣어주면 표의 칼럼명을 원하는 방식으로 변경시킬 수 있다.
Sepal Length | Sepal Width | Petal Length | Petal Width | Species |
---|---|---|---|---|
5.0 | 2.0 | 3.5 | 1.0 | versicolor |
6.5 | 3.2 | 5.1 | 2.0 | virginica |
5.5 | 3.5 | 1.3 | 0.2 | setosa |
4.9 | 3.1 | 1.5 | 0.2 | setosa |
6.5 | 3.0 | 5.8 | 2.2 | virginica |
align=
인자를 조정해서 칼럼별로 정렬을 달리 할 수 있다.
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
5.7 | 2.9 | 4.2 | 1.3 | versicolor |
6.4 | 3.2 | 5.3 | 2.3 | virginica |
5.7 | 2.6 | 3.5 | 1.0 | versicolor |
5.8 | 2.6 | 4.0 | 1.2 | versicolor |
5.2 | 3.4 | 1.4 | 0.2 | setosa |
품종별로 각각 표를 만들 필요가 있을 때 for
루프를 돌려 해당 품종별로 표를 제작한다. 이를 위해서 ```{r show-iris-species, results='asis'}
와 같이 R 코드청크를 제작한다.
library(glue)
species <- unique(iris$Species)
for (i in seq_along(species)) {
species_tbl <- iris %>%
filter(Species == species[i]) %>%
head() %>%
kable(caption = glue('붓꽃 품종: {species[i]}'))
print(species_tbl)
cat('\n\n<!-- -->\n\n')
}
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | setosa |
4.9 | 3.0 | 1.4 | 0.2 | setosa |
4.7 | 3.2 | 1.3 | 0.2 | setosa |
4.6 | 3.1 | 1.5 | 0.2 | setosa |
5.0 | 3.6 | 1.4 | 0.2 | setosa |
5.4 | 3.9 | 1.7 | 0.4 | setosa |
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
7.0 | 3.2 | 4.7 | 1.4 | versicolor |
6.4 | 3.2 | 4.5 | 1.5 | versicolor |
6.9 | 3.1 | 4.9 | 1.5 | versicolor |
5.5 | 2.3 | 4.0 | 1.3 | versicolor |
6.5 | 2.8 | 4.6 | 1.5 | versicolor |
5.7 | 2.8 | 4.5 | 1.3 | versicolor |
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
6.3 | 3.3 | 6.0 | 2.5 | virginica |
5.8 | 2.7 | 5.1 | 1.9 | virginica |
7.1 | 3.0 | 5.9 | 2.1 | virginica |
6.3 | 2.9 | 5.6 | 1.8 | virginica |
6.5 | 3.0 | 5.8 | 2.2 | virginica |
7.6 | 3.0 | 6.6 | 2.1 | virginica |
kable()
의 기본 기능에 다음 기능을 추가로 할 수 있다.
kableExtra
멋내기kableExtra 팩키지를 활용하여 Create Awesome HTML Table with knitr::kable and kableExtra와 같이 멋진 표를 만들어낼 수 있다.
gt
그래프 문법(grammar of graphics)처럼 표 문법(grammar of table) gt
팩키지가 등장했다. 표를 분해하면 다음과 같고 이를 tibble
혹은 데이터프레임을 입력받아 GT 객체로 변환시킨 후에 GT 표를 HTML로 출력하는 작업흐름을 갖는다.
webshot2::webshot("https://blog.rstudio.com/2020/04/08/great-looking-tables-gt-0-2/", selector = "body > div.container > main > p:nth-child(10) > img", "fig/gt-concept.png")
gt
맛보기 2gt
팩키지에 내장된 exibble
데이터셋은 \(8 \times 9\) 구조를 갖는 단순한 데이터셋이지만 표와 관련된 다양한 형태를 개발에 사용할 주요한 정보를 담고 있다.
num | char | fctr | date | time | datetime | currency | row | group |
---|---|---|---|---|---|---|---|---|
1.111e-01 | apricot | one | 2015-01-15 | 13:35 | 2018-01-01 02:22 | 49.950 | row_1 | grp_a |
2.222e+00 | banana | two | 2015-02-15 | 14:40 | 2018-02-02 14:33 | 17.950 | row_2 | grp_a |
3.333e+01 | coconut | three | 2015-03-15 | 15:45 | 2018-03-03 03:44 | 1.390 | row_3 | grp_a |
4.444e+02 | durian | four | 2015-04-15 | 16:50 | 2018-04-04 15:55 | 65100.000 | row_4 | grp_a |
5.550e+03 | NA | five | 2015-05-15 | 17:55 | 2018-05-05 04:00 | 1325.810 | row_5 | grp_b |
NA | fig | six | 2015-06-15 | NA | 2018-06-06 16:11 | 13.255 | row_6 | grp_b |
7.770e+05 | grapefruit | seven | NA | 19:10 | 2018-07-07 05:22 | NA | row_7 | grp_b |
8.880e+06 | honeydew | eight | 2015-08-15 | 20:20 | NA | 0.440 | row_8 | grp_b |
fmt_
함수와 tab_
함수처럼 tidyverse
생태계를 구성하고 있는 다양한 팩키지와 동일한 사고체계와 문법을 따르고 있는 것을 확인할 수 있다.
exibble %>%
gt() %>%
fmt_number(columns = vars(num), decimals = 2) %>%
fmt_date(columns = vars(date), date_style = 6) %>%
fmt_time(columns = vars(time), time_style = 4) %>%
fmt_datetime(columns = vars(datetime), date_style = 6, time_style = 4) %>%
fmt_currency(columns = vars(currency), currency = "EUR") %>%
tab_header(
title = md("This is the `exibble` dataset in **gt**"),
subtitle = "It is one of six datasets in the package"
) %>%
tab_source_note(md("More information is available at `?exibble`."))
This is the exibble dataset in gt |
||||||||
---|---|---|---|---|---|---|---|---|
It is one of six datasets in the package | ||||||||
num | char | fctr | date | time | datetime | currency | row | group |
0.11 | apricot | one | Jan 15, 2015 | 1:35 PM | Jan 1, 2018 2:22 AM | €49.95 | row_1 | grp_a |
2.22 | banana | two | Feb 15, 2015 | 2:40 PM | Feb 2, 2018 2:33 PM | €17.95 | row_2 | grp_a |
33.33 | coconut | three | Mar 15, 2015 | 3:45 PM | Mar 3, 2018 3:44 AM | €1.39 | row_3 | grp_a |
444.40 | durian | four | Apr 15, 2015 | 4:50 PM | Apr 4, 2018 3:55 PM | €65,100.00 | row_4 | grp_a |
5,550.00 | NA | five | May 15, 2015 | 5:55 PM | May 5, 2018 4:00 AM | €1,325.81 | row_5 | grp_b |
NA | fig | six | Jun 15, 2015 | NA | Jun 6, 2018 4:11 PM | €13.26 | row_6 | grp_b |
777,000.00 | grapefruit | seven | NA | 7:10 PM | Jul 7, 2018 5:22 AM | NA | row_7 | grp_b |
8,880,000.00 | honeydew | eight | Aug 15, 2015 | 8:20 PM | NA | €0.44 | row_8 | grp_b |
More information is available at ?exibble . |