GT

GT로 아름다운 테이블 만들기
R
table
gt
Author

JYH

Published

April 1, 2023

패키지 소개

  • 데이터프레임 등을 table로 변환하여 출력이 가능합니다.
  • 조건에 따라 각 셀이나 글자의 색을 변경할 수 있습니다.

Table 구조

gt에서의 테이블 구조는 다음과 같습니다.

gt 로 테이블을 만들기 위해 gt 패키지 내부에 있는 gtcars 데이터를 활용하도록 하겠습니다.

gtcarsmtcars처럼 차량 데이터이지만, 좀더 최근의 슈퍼카 데이터로 구성되어 있습니다.

library(gt)
gtcar_dt <- as.data.table(gtcars)[,.(ctry_origin, mfr, model,year, trim, msrp)]
gtcar_dt <- gtcar_dt[gtcar_dt[,.I[1:2],by=.(ctry_origin)]$V1]
gtcar_dt[,id := seq_len(.N)]
gtcar_dt |> 
  gt(rowname_col = "id") |> 
  tab_header(
    title = md("**Super cars**"),
    subtitle = md("Find your *Dream* car!")
  ) |> 
  tab_footnote(
    footnote = "Manufacturer",
    locations = cells_column_labels(columns = mfr)
  ) |> 
  tab_footnote(
    footnote = "Units: $",
    locations = cells_column_labels(msrp)
  ) |> 
  tab_source_note(
    source_note = md("URL: https://gt.rstudio.com/articles/intro-creating-gt-tables.html")
  )
Super cars
Find your Dream car!
ctry_origin mfr1 model year trim msrp2
1 United States Ford GT 2017 Base Coupe 447000
2 United States Chevrolet Corvette 2016 Z06 Coupe 88345
3 Italy Ferrari 458 Speciale 2015 Base Coupe 291744
4 Italy Ferrari 458 Spider 2015 Base 263553
5 Japan Acura NSX 2017 Base Coupe 156000
6 Japan Nissan GT-R 2016 Premium Coupe 101770
7 United Kingdom Bentley Continental GT 2016 V8 Coupe 198500
8 United Kingdom Aston Martin DB11 2017 Base Coupe 211195
9 Germany BMW 6-Series 2016 640 I Coupe 77300
10 Germany BMW i8 2016 Mega World Coupe 140700
URL: https://gt.rstudio.com/articles/intro-creating-gt-tables.html
1 Manufacturer
2 Units: $

Stub

stub은 행의 이름과 연관된 항목들입니다. 예를 들어, gtcars에서는 각 자동차 브랜드들의 국적을 그룹으로 나누어 표시할 수 있겠죠. 행을 그룹으로 묶어 분류를 해보도록 하겠습니다.

gtcar_dt |> 
  gt(rowname_col = "id") |> 
  tab_stubhead(label="No") |> 
  tab_row_group(
    label = "USA",
    rows = 1:2
  ) |> 
  tab_row_group(
    label = "Italy",
    rows = 3:4
  ) |>  as_raw_html()
No ctry_origin mfr model year trim msrp
Italy
3 Italy Ferrari 458 Speciale 2015 Base Coupe 291744
4 Italy Ferrari 458 Spider 2015 Base 263553
USA
1 United States Ford GT 2017 Base Coupe 447000
2 United States Chevrolet Corvette 2016 Z06 Coupe 88345
5 Japan Acura NSX 2017 Base Coupe 156000
6 Japan Nissan GT-R 2016 Premium Coupe 101770
7 United Kingdom Bentley Continental GT 2016 V8 Coupe 198500
8 United Kingdom Aston Martin DB11 2017 Base Coupe 211195
9 Germany BMW 6-Series 2016 640 I Coupe 77300
10 Germany BMW i8 2016 Mega World Coupe 140700

위의 예시에서는 tab_row_group()을 이용해 행 그룹의 이름과 행의 번호를 지정해주었습니다. 보다 편리하게 이 작업을 수행하기 위해 group_by()를 이용해 행들을 묶을 수 있습니다.

library(dplyr)
gtcar_dt |> 
  group_by(ctry_origin) |> 
  arrange(mfr, desc(msrp)) |> 
  gt(rowname_col = "id")
mfr model year trim msrp
Japan
5 Acura NSX 2017 Base Coupe 156000
6 Nissan GT-R 2016 Premium Coupe 101770
United Kingdom
8 Aston Martin DB11 2017 Base Coupe 211195
7 Bentley Continental GT 2016 V8 Coupe 198500
Germany
10 BMW i8 2016 Mega World Coupe 140700
9 BMW 6-Series 2016 640 I Coupe 77300
United States
2 Chevrolet Corvette 2016 Z06 Coupe 88345
1 Ford GT 2017 Base Coupe 447000
Italy
3 Ferrari 458 Speciale 2015 Base Coupe 291744
4 Ferrari 458 Spider 2015 Base 263553

제조사와 모델을 합쳐서 표를 만들어 보겠습니다.

gtcar_dt |> 
  arrange(mfr, desc(msrp)) |> 
  mutate(car = paste(mfr, model)) |> 
  select(-mfr, -model, -id) |> 
  group_by(ctry_origin) |> 
  gt(rowname_col = "car")
year trim msrp
Japan
Acura NSX 2017 Base Coupe 156000
Nissan GT-R 2016 Premium Coupe 101770
United Kingdom
Aston Martin DB11 2017 Base Coupe 211195
Bentley Continental GT 2016 V8 Coupe 198500
Germany
BMW i8 2016 Mega World Coupe 140700
BMW 6-Series 2016 640 I Coupe 77300
United States
Chevrolet Corvette 2016 Z06 Coupe 88345
Ford GT 2017 Base Coupe 447000
Italy
Ferrari 458 Speciale 2015 Base Coupe 291744
Ferrari 458 Spider 2015 Base 263553

Column labels

  • table의 열 다루기

Column 묶기

air_dt <- airquality |> head(10)

air_tbl <- air_dt |> 
  gt() |> 
  tab_header(
    title = "New York Air Quality Measurements"
  ) |> 
  tab_spanner(
    label="Measurement",
    columns = c(Ozone, Solar.R, Wind, Temp)
  ) |> 
  tab_spanner(
    label="Time",
    columns = c(Month, Day)
  )
air_tbl
New York Air Quality Measurements
Measurement Time
Ozone Solar.R Wind Temp Month Day
41 190 7.4 67 5 1
36 118 8.0 72 5 2
12 149 12.6 74 5 3
18 313 11.5 62 5 4
NA NA 14.3 56 5 5
28 NA 14.9 66 5 6
23 299 8.6 65 5 7
19 99 13.8 59 5 8
8 19 20.1 61 5 9
NA 194 8.6 69 5 10

Column 이동 및 이름 수정

air_tbl <- air_tbl |> 
  cols_move_to_start(
    columns = c(Month, Day)
  ) |> 
  cols_label(
    Ozone = html("Ozone,<br>ppbV"),
    Solar.R = html("Solar R.,<br>cal/m<sup>2</sup>"),
    Wind = html("Wind,<br>mph"),
    Temp = html("Temp,<br>&deg;F")
  )

air_tbl
New York Air Quality Measurements
Time Measurement
Month Day Ozone,
ppbV
Solar R.,
cal/m2
Wind,
mph
Temp,
°F
5 1 41 190 7.4 67
5 2 36 118 8.0 72
5 3 12 149 12.6 74
5 4 18 313 11.5 62
5 5 NA NA 14.3 56
5 6 28 NA 14.9 66
5 7 23 299 8.6 65
5 8 19 99 13.8 59
5 9 8 19 20.1 61
5 10 NA 194 8.6 69

Column 정렬

air_tbl |> 
  cols_align(
    align = "center",
    columns = c(Month, Day)
  )
New York Air Quality Measurements
Time Measurement
Month Day Ozone,
ppbV
Solar R.,
cal/m2
Wind,
mph
Temp,
°F
5 1 41 190 7.4 67
5 2 36 118 8.0 72
5 3 12 149 12.6 74
5 4 18 313 11.5 62
5 5 NA NA 14.3 56
5 6 28 NA 14.9 66
5 7 23 299 8.6 65
5 8 19 99 13.8 59
5 9 8 19 20.1 61
5 10 NA 194 8.6 69

Column 값에 따른 스타일 변경 1

gt 의 또다른 강력함은 조건에 따라 셀의 색상을 지정할 수 있다는 데 있습니다.

먼저 특정 조건에 따른 행의 색상을 지정할 수 있습니다.

air_dt |> 
  gt() |> 
  tab_style(
    style = list(cell_fill(color="red"),
                 cell_text(weight="bold",color="white")),
    locations = cells_body(columns = Wind,
                           rows = Wind > 10 )
  ) |> 
  tab_style(
    style = list(cell_fill(color="blue"),
                 cell_text(weight="bold",color="white")),
    locations = cells_body(columns = Wind,
                           rows = Wind < 10 )
  )
Ozone Solar.R Wind Temp Month Day
41 190 7.4 67 5 1
36 118 8.0 72 5 2
12 149 12.6 74 5 3
18 313 11.5 62 5 4
NA NA 14.3 56 5 5
28 NA 14.9 66 5 6
23 299 8.6 65 5 7
19 99 13.8 59 5 8
8 19 20.1 61 5 9
NA 194 8.6 69 5 10

Column 값에 따른 스타일 변경 2

다음으로는 data_color() 를 이용해 팔레트 색상을 지정할 수 있습니다. data_color()에서 팔레트를 지정하는 방법은 다음과 같습니다.

  1. 원하는 색상 이름 지정
  2. RColorBrewer 팔레트 사용
  3. viridis 계열 팔레트 사용 (e.g., "viridis", "magma", "inferno", etc)
air_dt |> 
  gt() |> 
  data_color(Wind,
             direction = "column",
             palette=c("red","white","blue"),
             domain=c(7,25)
             ) |> 
  data_color(Temp, palette = "Oranges") |> 
  data_color(Solar.R, palette = "magma", na_color = "steelblue")
Ozone Solar.R Wind Temp Month Day
41 190 7.4 67 5 1
36 118 8.0 72 5 2
12 149 12.6 74 5 3
18 313 11.5 62 5 4
NA NA 14.3 56 5 5
28 NA 14.9 66 5 6
23 299 8.6 65 5 7
19 99 13.8 59 5 8
8 19 20.1 61 5 9
NA 194 8.6 69 5 10
cols_hide() #숨기기
Back to top