R) 패키지 gt 소개

R) 패키지 gt 소개

CRAN RStudio mirror downloads

보고서를 작성하다 보면 표를 그리기 마련이다. 다양한 패키지가 많지만 특별히 RStudio에서 공개하였고 HTML기반으로 출력이 나오고 하니 Shiny와의 궁합도 충분히 기대해볼만 하다. 그래서 향후 R의 table 작성에 표준이 될것만 같은 패키지 gt를 알아보고자 한다.

참고로 본 포스팅은 gt 0.2.0.5 버전에서 작성되었다.

공식 페이지의 샘플 코드

gt 패키지의 공식 페이지의 샘플 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
library(gt)
library(tidyverse)
library(glue)

start_date <- "2010-06-07"
end_date <- "2010-06-14"

sp500 %>%
dplyr::filter(date >= start_date & date <= end_date) %>%
dplyr::select(-adj_close) %>%
gt() %>%
tab_header(
title = "S&P 500",
subtitle = glue::glue("{start_date} to {end_date}")
) %>%
fmt_date(
columns = vars(date),
date_style = 3
) %>%
fmt_currency(
columns = vars(open, high, low, close),
currency = "USD"
) %>%
fmt_number(
columns = vars(volume),
suffixing = TRUE
)

기존 코드는 처음부터 너무 파이프라인 연산자를 많이 사용하여 보다 이해하기 쉽게 코드를 나누고 다듬으면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
library("gt")
library("tidyverse")
library("glue")

start_date = "2010-06-07"
end_date = "2010-06-14"

sp500 %>%
dplyr::filter(date >= start_date & date <= end_date) %>%
dplyr::select(-adj_close) -> sp500_sub # 1

head(sp500_sub) # 2
## # A tibble: 6 x 6
## date open high low close volume
## <date> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2010-06-14 1095 1106. 1089. 1090. 4425830000
## 2 2010-06-11 1083. 1092. 1077. 1092. 4059280000
## 3 2010-06-10 1059. 1088. 1059. 1087. 5144780000
## 4 2010-06-09 1063. 1078. 1052. 1056. 5983200000
## 5 2010-06-08 1051. 1063. 1042. 1062 6192750000
## 6 2010-06-07 1066. 1071. 1050. 1050. 5467560000

sp500_sub %>%
gt() %>%
tab_header(title = "S&P 500",
subtitle = glue("{start_date} to {end_date}")) %>%
fmt_date(columns = vars(date),
date_style = 3) %>%
fmt_currency(columns = vars(open, high, low, close),
currency = "USD") %>%
fmt_number(columns = vars(volume),
suffixing = TRUE) # 3

gt table 출력 결과

코드는 데이터 필터링 부분과 그래프/표 부분을 분리하는 것이 좋다. 왜냐하면 한 번 필터링 한 데이터는 다음에 또 사용할 일이 많이 때문이다. 물론 별도의 객체에 저장하지 않으면 공간복잡도에서 이득이 있는 것은 맞다.

1번 코드는 filter() 함수로 행(row) 필터링을, select() 함수로 열(column) 필터링을 실시하였다. 2번 코드에서 1번 코드의 수행 결과를 살짝 확인 한다. 그리고 3번 코드에서 테이블을 그리는 것이 되겠다.

다음에서 보다 자세하게 뜯어보도록 하자.

패키지 동작

gt 패키지는 다음과 같이 동작한다.

gt 패키지 동작

우선 tibble 객체나 data frame 객체로 입력을 받고 그것을 gt 객체로 변환한 다음에 gt 패키지의 함수를 통하여 HTML 로 작성된 표로 변환해준다. 그런데 확인 결과 data table 객체도 별 문제 없이 gt() 함수를 이용할 수 있었는데 굳이 언급을 하지 않은 이유는 유지보수 문제 때문이 아닌가 싶다. 예를 들어 data table 객체가 별도의 업데이트로 인해 동작이 되지 않을 경우 이를 위해 gt 패키지 까지 업데이트 해야하기 때문에 사전에 data frame과 tibble만 언급하지 않았나 라는 추측을 해본다.

data table 관련 예제 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
data.table::as.data.table(sp500_sub) %>% 
gt() %>%
tab_header(title = "S&P 500",
subtitle = glue("{start_date} to {end_date}")) %>%
fmt_date(columns = vars(date),
date_style = 3) %>%
fmt_currency(columns = vars(open, high, low, close),
currency = "USD") %>%
fmt_number(columns = vars(volume),
suffixing = TRUE)

함수의 구성

gt 패키지는 ggplot2 패키지와 많이 닮아있다. 함수를 잇는 연산자가 더하기(+)가 아닌 파이프라인(%>%) 연산자 라는 점이다. 언제 한 번 ggplot2의 연결 연산자를 파이프라인 연산자로 한다는 소문이 있었는데 레퍼런스를 못찾아서 일단 넘어가도록 하겠다.

다시 돌아와서 ggplot2 패키지와 코드가 닮았다고 하는 이유는 gt() 로 시작하는 문법 때문이다. 그리고 gt() 함수를 작성하고 소괄호 내부에서 [tab]키를 눌러보면 다음과 같이 뜬다.

gt 패키지의 gt() 함수

최초에 데이터를 선언하고 다음 함수에서 여러 설정을 지정해준다. 앞의 샘플 코드를 기준으로 얘기하자면, tab_header() 함수에서 표의 제목과 부제목 작성을 담당하고, fmt_date(), fmt_currency(), fmt_number() 함수에서는 각각 날짜, 돈, 숫자 관련 형식(format)을 담당한다.

정리하자면 다음과 같다.

  • gt(): gt객체를 생성하며 표 생성에 필수. 가장 먼저 써주어야 한다.
  • tab_*(): 표의 배치(layout)를 주로 담당
  • cell_*(): 각 요소의 배치를 도와주거나(helper function), 값 요약
  • fmt_*(): 셀 내부 데이터 표기 형식 담당

gt 패키지를 운용하기 위해서 gt() 이외에 필요한 주요 함수를 꼽자면 다음과 같다.

  • tab_header(): 표의 제목과 부제목 담당
  • tab_footnote(): 주석 담당하며 도움 함수(helper function)와 같이 사용
  • cells_title(): 도움 함수로 제목 또는 부제목에 주석을 지정할 때 사용
  • cells_body(): 도움 함수로 셀 데이터 전체 또는 특정 위치에 주석을 지정할 때 사용
  • fmt_date(): 날짜 데이터 형식 지정에 사용
  • fmt_currency(): 금전 데이터 형식 지정에 사용
  • fmt_number(): 숫자 데이터 형식 지정에 사용
  • fmt_missing(): 결측 데이터 처리에 사용
  • gtsave(): 표 저장시 사용

이 외의 함수는 깃허브 저장소에 공유되어있는 그림을 참고하여 함수를 운용해보는 것을 권장한다.
gt 객체의 명칭

관련 패키지

R에는 GT이외에도 표를 다루는 패키지가 제법 많다. 다음은 관련 패키지 정보이니 다른 패키지가 필요한 사람은 참고하도록 하자.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×