1 R마크다운 표 1

kableExtra, knitr::kable() 함수는 통해 R마크다운 문서에 포함되는 표를 원하는 방향으로 작성할 수 있다.

R마크다운 표 기능을 시연하는데 mtcars 데이터프레임을 기본 데이터로 많이 사용한다.

1.1 헬로우 월드 표

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

1.2 표 칼럼명 지정

kable() 함수 내부에 col.names =에 칼럼명을 넣어주면 표의 칼럼명을 원하는 방식으로 변경시킬 수 있다.

  • Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species
  • Sepal Length, Sepal Width, Petal Length, Petal Width, Species
iris %>% 
  sample_n(5) %>% 
  kable(col.names = str_replace(names(iris), "\\.", " "))
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

1.3 표 칼럼 정렬

align= 인자를 조정해서 칼럼별로 정렬을 달리 할 수 있다.

iris %>% 
  sample_n(5) %>% 
  kable(align=c("rclcr"))
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

1.4 표 칼럼 캡션

align= 인자를 조정해서 칼럼별로 정렬을 달리 할 수 있다. \@ref(tab:rmd-table-columns-caption)와 같이 표 1.1을 상호참조할 수 있게 제작할 수 있다.

opts_current$append(list(label = "tw"))
iris %>% 
  sample_n(5) %>% 
  kable(caption = "붓꽃 원자료 자막입니다.")
Table 1.1: 붓꽃 원자료 자막입니다. Table: Table 1.2: 붓꽃 원자료 자막입니다.
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
6.4 2.9 4.3 1.3 versicolor
6.2 2.8 4.8 1.8 virginica
6.8 3.0 5.5 2.1 virginica
5.8 2.6 4.0 1.2 versicolor
6.3 2.5 5.0 1.9 virginica

1.5 표를 루프 돌리기

품종별로 각각 표를 만들 필요가 있을 때 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')
}
Table 1.3: 붓꽃 품종: setosa
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
Table 1.3: 붓꽃 품종: versicolor
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
Table 1.3: 붓꽃 품종: virginica
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

1.6 기타

kable()의 기본 기능에 다음 기능을 추가로 할 수 있다.

  • 숫자형 칼럼 자리숫 및 천단위 구분자 추가
  • 결측값
  • 특수 문자 이스케이프(escape)

2 kableExtra 멋내기

kableExtra 팩키지를 활용하여 Create Awesome HTML Table with knitr::kable and kableExtra와 같이 멋진 표를 만들어낼 수 있다.

3 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")

3.1 gt 맛보기 2

gt 팩키지에 내장된 exibble 데이터셋은 \(8 \times 9\) 구조를 갖는 단순한 데이터셋이지만 표와 관련된 다양한 형태를 개발에 사용할 주요한 정보를 담고 있다.

library(gt)

exibble %>% 
  kable()
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.