gt入門

作成日

2023年3月14日

更新日

2023年3月14日

はじめに

ファイル名 ダウンロード
countries_desc1.csv Download
countries_desc2.csv Download
countries_desc3.csv Download

 記述統計や推定結果を示す場合は図表が用いられることが多い。図に関しては{ggplot2}が最もポピュラーなパッケージである(Base Rもまた根強い人気を誇る)。一方、表の場合、現時点において2つの選択肢がある。一つはこれまで長らく使われてきた{knitr}パッケージのkable()と{kabelExtra}パッケージの組み合わせ、もう一つが近年注目を集めている{gt}パッケージだ。

 {gt}はGrammar of Tablesの略であり、Grammar of Graphicsの具現化した{ggplot2}の影響を受けたものである。つまり、一つの表を独立した要素に分解し、それぞれのレイヤーを重ねていくイメージだ。{ggplot2}の考え方\(\neq\)使い方)に慣れている読者なら{gt}にもすぐ慣れるだろう。ただし、{gt}は開発途上であり、PDF出力との相性が現在 (2023年03月14日; {gt} 0.8.0)、優れているとはいい難い。表をPDF形式に出力したいのであれば{knitr}のkable() + {kableExtra}を推奨する。また、{gt}単体での機能はkable() + {kableExtra}より貧弱ではあったものの、現在は{gtExtras}の登場により、ほぼ同じことが行えるようになった。

 ここではRStudio社が開発をサポートしている{gt}パッケージについて簡単に解説する1。また、どのパッケージもHTML出力とLaTeX出力両方に対応しているが、ここではHTML出力のみ紹介する。ただし、LaTeX出力に関しては引数の追加などで簡単にできるため、詳細は各パッケージの公式ページやヴィネット等を参考されたい。

 それではまず、実習に使用するパッケージとデータを読み込でおこう。

pacman::p_load(tidyverse, gt, gtExtras, DT)

df1 <- read_csv("Data/countries_desc1.csv")
df2 <- read_csv("Data/countries_desc2.csv")
df3 <- read_csv("Data/countries_desc3.csv")
df1
# A tibble: 7 × 6
  Variable         Mean      SD        Min      Max   Obs
  <chr>           <dbl>   <dbl>      <dbl>    <dbl> <dbl>
1 Population     41.7   151.      0.000801 1447.      186
2 Area           69.6   187.      0        1638.      186
3 GDP_per_capita  1.62    2.57    0.00577    18.3     185
4 PPP_per_capita  2.08    2.10    0.0733     11.3     178
5 HDI_2018        0.713   0.153   0.377       0.954   180
6 Polity_Score    4.26    6.10  -10          10       158
7 FH_Total       57.7    29.9     0         100       185
df2
# A tibble: 35 × 7
   Continent Variable          Mean      SD      Min     Max   Obs
   <chr>     <chr>            <dbl>   <dbl>    <dbl>   <dbl> <dbl>
 1 Africa    Population      24.6    35.9    0.0983  206.       54
 2 Africa    Area            54.4    59.2    0.046   238.       54
 3 Africa    GDP_per_capita   0.251   0.313  0.00577   1.73     54
 4 Africa    PPP_per_capita   0.567   0.602  0.0733    2.78     52
 5 Africa    HDI_2018         0.553   0.109  0.377     0.801    53
 6 Africa    Polity_Score     2.48    5.00  -9        10        48
 7 Africa    FH_Total        41.6    25.1    2        92        54
 8 America   Population      28.7    66.3    0.0532  334.       36
 9 America   Area           108.    246.     0.026   916.       36
10 America   GDP_per_capita   1.25    1.27   0.0745    6.44     36
# … with 25 more rows
df3
# A tibble: 5 × 8
  Continent Population  Area   GDP   PPP   HDI Polity    FH
  <chr>          <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl>
1 Africa          24.6  54.4 0.251 0.567 0.553  2.48   41.6
2 America         28.7 108.  1.25  1.81  0.742  6.93   71.9
3 Asia           107.   70.2 1.32  2.27  0.723  0.342  38.9
4 Europe          17.1  46.5 3.56  3.78  0.861  7.93   79.4
5 Oceania         10.0 210.  2.66  2.76  0.782  7.25   79  

{gt}の使い方

表の出力

 {gt}では、表がタイトル、列ラベル、ホディ―などの要素で構成されている考え( 図 1 )、それぞれの要素を追加したり、修正する形で表を作成する。

図 1: {gt}テーブルの構成要素

 まず、これまで使ってきたdf1を使ってHTML形式の表を出力してみよう。使用する関数はgt()であり、data.frameまたはtibbleオブジェクト名が第1引数である。

df1 |>
    gt()
Variable Mean SD Min Max Obs
Population 41.7377735 151.2702976 0.000801000 1447.47009 186
Area 69.6069247 187.2412489 0.000000000 1637.68700 186
GDP_per_capita 1.6158103 2.5710359 0.005770007 18.31772 185
PPP_per_capita 2.0833383 2.0992134 0.073314173 11.34231 178
HDI_2018 0.7134833 0.1528503 0.377000000 0.95400 180
Polity_Score 4.2594937 6.1022919 -10.000000000 10.00000 158
FH_Total 57.7135135 29.8656244 0.000000000 100.00000 185

列の操作

 これだけでも十分に綺麗な表が出来上がった。それではこちらの表を少しずつ修正してみよう。まず、Mean列からMax列だが、これを小数点3桁で丸めてみよう。これらの数字は 図 1 のTable Bodyに該当する。このTable Bodyのフォーマットに関わる調整はfmt_*()関数を使用する。Mean列からMax列までの数値に関する調整はfmt_number()関数を使用する。gt()で作成された表オブジェクトをそのままfmt_number()に渡し、columns引数で何列に当該内容を適用するかを指定する。たとえば、Mean列からMax列までは2〜5列目に相当するのでcolumns = 2:5、またはcolumns = c(2, 3, 4, 5)で良い。続いて、小数点の桁数を指定するdecimalsに3を指定してみよう。

df1 |>
    gt() |>
    fmt_number(columns = 2:5, decimals = 3)
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185

 columnsは列の番号じゃなく、列名そのままでも指定できる。

df1 |>
    gt() |>
    fmt_number(columns = c("Mean", "SD", "Min", "Max"), decimals = 3)
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185

 列名の変更はcols_lable()レイヤーで行う。()内には"元の列名" = "新しい列名"のように記述する。kbl()は全ての列に対して列名を指定しないといけなかったが(つまり、変更したくない列も一応、指定が必要)、{gt}だと変更したい列のみ指定しても良いといったメリットがある。

df1 |>
    gt() |>
    fmt_number(columns = 2:5, decimals = 3) |>
    cols_label("Variable" = "変数", "Mean" = "平均値", "SD" = "標準偏差",
               "Min" = "最小値", "Max" = "最大値", "Obs" = "有効ケース数")
変数 平均値 標準偏差 最小値 最大値 有効ケース数
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185

 もう一つ見たいこところは、各セル内のテキストの揃えだ。たとえば、文字型列のVariableは左揃え、数値型列であるその他の列は右揃えになっている。これはこのままで問題ない。しかし、どうしても特定の列を中央揃えしたい時もあるだろう。その場合、cols_align()レイヤーで修正することができる。たとえば、Variable列の値を中央揃えに変えてみよう。引数はalign"left""center""right"のいずれかを、columnsには適用したい列の番号、または列名を指定する。

df1 |>
  gt() |>
  fmt_number(columns = 2:5, decimals = 3) |>
  cols_align(align = "center", columns = 1) # columns = Variable でもOK
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185

 また、各列のラベル(図 1 のcolumn labels)の位置も表のボディー(図 1 のtable body)に連動する。もし、列ラベルのみ中央揃えにしたい場合はtab_style()レイヤーを使用する。

df1 |>
  gt() |>
  fmt_number(columns = 2:5, decimals = 3) |>
  tab_style(style     = cell_text(align = "center"), # どうする?: 中央揃え
            locations = cells_column_labels())       # どこを?: 列レベルだけ
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185

 また、HTMLのCSSによって異なるが、{gt}で作成された表の幅がページの幅に強制的に調整される場合がある。本書はQuartoで執筆されているが、まさにそのケースである。この場合は、as_raw_html()を使えば良い。一つ注意すべき点はas_raw_html()は必ず最後のレイヤーにする必要がある。as_raw_html()の後ろにレイヤーが足される場合はエラーが発生する。

df1 |>
    gt() |>
    fmt_number(columns = 2:5, decimals = 3) |>
    as_raw_html()
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185

 このas_raw_html()は必要に応じて入れる。R Markdown/Quartoを使わない場合はそもそも不要だ(RStudioのViewerペインでは問題なく表示される)。もし、R Markdown/Quartoで{gt}を使用し、表の幅が気に入らない場合のみ使うことにしよう。

タイトル・フットノート

 表のタイトルおよびサブタイトルはtab_header()関数のtitlesubtitle引数で指定できる。また、表の下段に位置するフットノート(footnote)とソースノート(source note)は別の関数に対応し、それぞれtab_footnote()tab_source_note()を使う。使用する引数はそれぞれfootnotesource_noteであるが、第1引数であるため、省略可能だ。

df1 |>
  gt() |>
  fmt_number(columns = 2:5, decimals = 3) |>
  tab_header(title = "タイトル", subtitle = "サブタイトル") |>
  tab_footnote(footnote = "注: ここにはフットノートが入る") |>
  tab_source_note(source_note = "出典: 『私たちのR』") |>
  as_raw_html()
タイトル
サブタイトル
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185
出典: 『私たちのR』
注: ここにはフットノートが入る

 ちなみに、tab_footnote()tab_source_note()は複数回使用することで複数行にすることができる。

df1 |>
  gt() |>
  fmt_number(columns = 2:5, decimals = 3) |>
  tab_header(title = "タイトル", subtitle = "サブタイトル") |>
  tab_footnote(footnote = "注1: ここにはフットノート1が入る") |>
  tab_footnote(footnote = "注2: ここにはフットノート2が入る") |>
  tab_source_note(source_note = "出典: 『私たちのR』") |>
  as_raw_html()
タイトル
サブタイトル
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185
出典: 『私たちのR』
注1: ここにはフットノート1が入る
注2: ここにはフットノート2が入る

 また、タイトルやフットノートに限定された機能ではないが、テキストはMarkdownやHTML文法で書くこともできる。たとえば、上記のコードの『私たちのR』にリンクを貼る場合、Markdown文法だと"『[私たちのR](https://www.jaysong.net/RBook/)』"となるが、このままではうまくいかない。

df1 |>
  gt() |>
  fmt_number(columns = 2:5, decimals = 3) |>
  tab_header(title = "タイトル", subtitle = "サブタイトル") |>
  tab_footnote(footnote = "注1: ここにはフットノート1が入る") |>
  tab_footnote(footnote = "注2: ここにはフットノート2が入る") |>
  tab_source_note(source_note = "出典: 『[私たちのR](https://www.jaysong.net/RBook/)』") |>
  as_raw_html()
タイトル
サブタイトル
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185
出典: 『[私たちのR](https://www.jaysong.net/RBook/)』
注1: ここにはフットノート1が入る
注2: ここにはフットノート2が入る

 Markdown文法を使う場合は、文字列をmd()関数内で指定することでMarkdown文として解釈されるようになる。

df1 |>
  gt() |>
  fmt_number(columns = 2:5, decimals = 3) |>
  tab_header(title = "タイトル", subtitle = "サブタイトル") |>
  tab_footnote(footnote = "注1: ここにはフットノート1が入る") |>
  tab_footnote(footnote = "注2: ここにはフットノート2が入る") |>
  tab_source_note(source_note = md("出典: 『[私たちのR](https://www.jaysong.net/RBook/)』")) |>
  as_raw_html()
タイトル
サブタイトル
Variable Mean SD Min Max Obs
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185
出典: 『私たちのR
注1: ここにはフットノート1が入る
注2: ここにはフットノート2が入る

グループ化

 列をグループ化するためにはtab_spanner()関数を使う。columns引数にはグループ化する列の位置、もしくは名前を、labelにはグループ名を指定すれば良い。たとえば、df1を使う場合、MinMax列を一つのグループとしてRangeと名付けるとしよう。columnsは列の番号でも、列名でも良い。

df1 |>
    gt() |>
    tab_spanner(columns = 4:5, label = "Range") |>
    fmt_number(columns = 2:5, decimals = 3) |>
    as_raw_html()
Variable Mean SD Range Obs
Min Max
Population 41.738 151.270 0.001 1,447.470 186
Area 69.607 187.241 0.000 1,637.687 186
GDP_per_capita 1.616 2.571 0.006 18.318 185
PPP_per_capita 2.083 2.099 0.073 11.342 178
HDI_2018 0.713 0.153 0.377 0.954 180
Polity_Score 4.259 6.102 −10.000 10.000 158
FH_Total 57.714 29.866 0.000 100.000 185

 続いて、行をグループ化する方法について紹介する。まず、df2の中身を確認してみよう。

df2 |>
    gt() |>
    as_raw_html()
Continent Variable Mean SD Min Max Obs
Africa Population 24.5609472 35.90062114 0.098347000 206.139589 54
Africa Area 54.4435111 59.21810613 0.046000000 238.174000 54
Africa GDP_per_capita 0.2514072 0.31334566 0.005770007 1.727394 54
Africa PPP_per_capita 0.5667087 0.60151933 0.073314173 2.778814 52
Africa HDI_2018 0.5532642 0.10889924 0.377000000 0.801000 53
Africa Polity_Score 2.4791667 5.00208290 -9.000000000 10.000000 48
Africa FH_Total 41.5740741 25.12955251 2.000000000 92.000000 54
America Population 28.7362271 66.28460983 0.053199000 334.308644 36
America Area 108.1607833 245.85173673 0.026000000 915.802000 36
America GDP_per_capita 1.2526519 1.27016543 0.074535927 6.444591 36
America PPP_per_capita 1.8100292 1.26006234 0.176587508 6.178997 35
America HDI_2018 0.7424722 0.09094975 0.466000000 0.922000 36
America Polity_Score 6.9259259 3.59407553 -5.000000000 10.000000 27
America FH_Total 71.9166667 22.42750225 14.000000000 98.000000 36
Asia Population 107.3001606 301.72686527 0.437479000 1447.470092 42
Asia Area 70.1983405 155.92487158 0.030000000 938.929100 42
Asia GDP_per_capita 1.3167525 1.70584531 0.049067972 6.368026 42
Asia PPP_per_capita 2.2728133 2.40667620 0.139610508 9.525177 41
Asia HDI_2018 0.7228537 0.12010715 0.463000000 0.935000 41
Asia Polity_Score 0.3421053 7.48431266 -10.000000000 10.000000 38
Asia FH_Total 38.9285714 25.15453977 0.000000000 96.000000 42
Europe Population 17.1127533 29.05674254 0.000801000 145.934462 50
Europe Area 46.4618980 230.34717622 0.000000000 1637.687000 50
Europe GDP_per_capita 3.5575266 3.86463361 0.296369600 18.317721 49
Europe PPP_per_capita 3.7782593 2.12763785 0.842873869 11.342306 46
Europe HDI_2018 0.8611304 0.06306914 0.711000000 0.954000 46
Europe Polity_Score 7.9268293 4.23314448 -7.000000000 10.000000 41
Europe FH_Total 79.4285714 22.70187217 10.000000000 100.000000 49
Oceania Population 10.0465332 10.81385119 0.896445000 25.499884 4
Oceania Area 210.4312500 372.29122053 1.827000000 768.230000 4
Oceania GDP_per_capita 2.6577585 2.60067976 0.279082855 5.461517 4
Oceania PPP_per_capita 2.7572651 2.19837188 0.417111768 5.000127 4
Oceania HDI_2018 0.7815000 0.18631604 0.543000000 0.938000 4
Oceania Polity_Score 7.2500000 3.20156212 4.000000000 10.000000 4
Oceania FH_Total 79.0000000 20.80064102 60.000000000 97.000000 4

 各大陸ごとの人口、面積などの情報が含まれている表であるが、これらを大陸単位で行をグループ化してみよう。方法は簡単だ。{dplyr}のようにgt()関数に渡す前に、group_by()でデータをグループ化すれば良い。今回はContinent列の値に基づいてグループ化するため、group_by(Continent)とする。

df2 |>
    group_by(Continent) |>
    gt() |>
    as_raw_html()
Variable Mean SD Min Max Obs
Africa
Population 24.5609472 35.90062114 0.098347000 206.139589 54
Area 54.4435111 59.21810613 0.046000000 238.174000 54
GDP_per_capita 0.2514072 0.31334566 0.005770007 1.727394 54
PPP_per_capita 0.5667087 0.60151933 0.073314173 2.778814 52
HDI_2018 0.5532642 0.10889924 0.377000000 0.801000 53
Polity_Score 2.4791667 5.00208290 -9.000000000 10.000000 48
FH_Total 41.5740741 25.12955251 2.000000000 92.000000 54
America
Population 28.7362271 66.28460983 0.053199000 334.308644 36
Area 108.1607833 245.85173673 0.026000000 915.802000 36
GDP_per_capita 1.2526519 1.27016543 0.074535927 6.444591 36
PPP_per_capita 1.8100292 1.26006234 0.176587508 6.178997 35
HDI_2018 0.7424722 0.09094975 0.466000000 0.922000 36
Polity_Score 6.9259259 3.59407553 -5.000000000 10.000000 27
FH_Total 71.9166667 22.42750225 14.000000000 98.000000 36
Asia
Population 107.3001606 301.72686527 0.437479000 1447.470092 42
Area 70.1983405 155.92487158 0.030000000 938.929100 42
GDP_per_capita 1.3167525 1.70584531 0.049067972 6.368026 42
PPP_per_capita 2.2728133 2.40667620 0.139610508 9.525177 41
HDI_2018 0.7228537 0.12010715 0.463000000 0.935000 41
Polity_Score 0.3421053 7.48431266 -10.000000000 10.000000 38
FH_Total 38.9285714 25.15453977 0.000000000 96.000000 42
Europe
Population 17.1127533 29.05674254 0.000801000 145.934462 50
Area 46.4618980 230.34717622 0.000000000 1637.687000 50
GDP_per_capita 3.5575266 3.86463361 0.296369600 18.317721 49
PPP_per_capita 3.7782593 2.12763785 0.842873869 11.342306 46
HDI_2018 0.8611304 0.06306914 0.711000000 0.954000 46
Polity_Score 7.9268293 4.23314448 -7.000000000 10.000000 41
FH_Total 79.4285714 22.70187217 10.000000000 100.000000 49
Oceania
Population 10.0465332 10.81385119 0.896445000 25.499884 4
Area 210.4312500 372.29122053 1.827000000 768.230000 4
GDP_per_capita 2.6577585 2.60067976 0.279082855 5.461517 4
PPP_per_capita 2.7572651 2.19837188 0.417111768 5.000127 4
HDI_2018 0.7815000 0.18631604 0.543000000 0.938000 4
Polity_Score 7.2500000 3.20156212 4.000000000 10.000000 4
FH_Total 79.0000000 20.80064102 60.000000000 97.000000 4

 このようにグループ化することができる。引き続きMean列からMax列までの値を小数点3桁目で丸めてみよう。MeanMax列の位置は2、5列目であるかのように見える。とりあえずやってみよう。

df2 |>
    group_by(Continent) |>
    gt() |>
    fmt_number(columns = 2:5, decimals = 3) |>
    as_raw_html()
Error in `fmt_number()`:
! The `fmt_number()` and `fmt_integer()` functions can only be used on
  `columns` with numeric data.

 このようにエラーが表示される。なぜだろう。それはグルーピングに使用された変数も1つの列としてカウントされるからだ。つまり、グルーピングに使用されたContinent列は列としては見えないものの、1列目として存在する。したがって、目に見える列番号に1を足す必要がある。それではグルーピングあと、Mean列からMax列までは小数点3桁目で丸め、Min列とMax列はRangeという名でグルーピングしてみよう。

df2 |>
    group_by(Continent) |>
    gt() |>
    tab_spanner(columns = 5:6, label = "Range") |>
    fmt_number(columns = 3:6, decimals = 3) |>
    as_raw_html()
Variable Mean SD Range Obs
Min Max
Africa
Population 24.561 35.901 0.098 206.140 54
Area 54.444 59.218 0.046 238.174 54
GDP_per_capita 0.251 0.313 0.006 1.727 54
PPP_per_capita 0.567 0.602 0.073 2.779 52
HDI_2018 0.553 0.109 0.377 0.801 53
Polity_Score 2.479 5.002 −9.000 10.000 48
FH_Total 41.574 25.130 2.000 92.000 54
America
Population 28.736 66.285 0.053 334.309 36
Area 108.161 245.852 0.026 915.802 36
GDP_per_capita 1.253 1.270 0.075 6.445 36
PPP_per_capita 1.810 1.260 0.177 6.179 35
HDI_2018 0.742 0.091 0.466 0.922 36
Polity_Score 6.926 3.594 −5.000 10.000 27
FH_Total 71.917 22.428 14.000 98.000 36
Asia
Population 107.300 301.727 0.437 1,447.470 42
Area 70.198 155.925 0.030 938.929 42
GDP_per_capita 1.317 1.706 0.049 6.368 42
PPP_per_capita 2.273 2.407 0.140 9.525 41
HDI_2018 0.723 0.120 0.463 0.935 41
Polity_Score 0.342 7.484 −10.000 10.000 38
FH_Total 38.929 25.155 0.000 96.000 42
Europe
Population 17.113 29.057 0.001 145.934 50
Area 46.462 230.347 0.000 1,637.687 50
GDP_per_capita 3.558 3.865 0.296 18.318 49
PPP_per_capita 3.778 2.128 0.843 11.342 46
HDI_2018 0.861 0.063 0.711 0.954 46
Polity_Score 7.927 4.233 −7.000 10.000 41
FH_Total 79.429 22.702 10.000 100.000 49
Oceania
Population 10.047 10.814 0.896 25.500 4
Area 210.431 372.291 1.827 768.230 4
GDP_per_capita 2.658 2.601 0.279 5.462 4
PPP_per_capita 2.757 2.198 0.417 5.000 4
HDI_2018 0.781 0.186 0.543 0.938 4
Polity_Score 7.250 3.202 4.000 10.000 4
FH_Total 79.000 20.801 60.000 97.000 4

 ややこしい話であるが、列を番号でなく、列名で指定すると、このような混乱を避けることができる。列の指定方法は好みの問題でもあるので、好きなやり方を使おう。

df2 |>
    group_by(Continent) |>
    gt() |>
    tab_spanner(columns = Min:Max, label = "Range") |>
    fmt_number(columns = Mean:Max, decimals = 3) |>
    as_raw_html()
Variable Mean SD Range Obs
Min Max
Africa
Population 24.561 35.901 0.098 206.140 54
Area 54.444 59.218 0.046 238.174 54
GDP_per_capita 0.251 0.313 0.006 1.727 54
PPP_per_capita 0.567 0.602 0.073 2.779 52
HDI_2018 0.553 0.109 0.377 0.801 53
Polity_Score 2.479 5.002 −9.000 10.000 48
FH_Total 41.574 25.130 2.000 92.000 54
America
Population 28.736 66.285 0.053 334.309 36
Area 108.161 245.852 0.026 915.802 36
GDP_per_capita 1.253 1.270 0.075 6.445 36
PPP_per_capita 1.810 1.260 0.177 6.179 35
HDI_2018 0.742 0.091 0.466 0.922 36
Polity_Score 6.926 3.594 −5.000 10.000 27
FH_Total 71.917 22.428 14.000 98.000 36
Asia
Population 107.300 301.727 0.437 1,447.470 42
Area 70.198 155.925 0.030 938.929 42
GDP_per_capita 1.317 1.706 0.049 6.368 42
PPP_per_capita 2.273 2.407 0.140 9.525 41
HDI_2018 0.723 0.120 0.463 0.935 41
Polity_Score 0.342 7.484 −10.000 10.000 38
FH_Total 38.929 25.155 0.000 96.000 42
Europe
Population 17.113 29.057 0.001 145.934 50
Area 46.462 230.347 0.000 1,637.687 50
GDP_per_capita 3.558 3.865 0.296 18.318 49
PPP_per_capita 3.778 2.128 0.843 11.342 46
HDI_2018 0.861 0.063 0.711 0.954 46
Polity_Score 7.927 4.233 −7.000 10.000 41
FH_Total 79.429 22.702 10.000 100.000 49
Oceania
Population 10.047 10.814 0.896 25.500 4
Area 210.431 372.291 1.827 768.230 4
GDP_per_capita 2.658 2.601 0.279 5.462 4
PPP_per_capita 2.757 2.198 0.417 5.000 4
HDI_2018 0.781 0.186 0.543 0.938 4
Polity_Score 7.250 3.202 4.000 10.000 4
FH_Total 79.000 20.801 60.000 97.000 4

 最後に、グルーピングとは関係ないものの、行の名前を指定する方法について説明する。それはgt()で表を作成する際、行の名前にしたい列名をrowname_colで指定すれば良い。たとえば、Variable列を行の名前にしてみよう。

df2 |>
    group_by(Continent) |>
    gt(rowname_col = "Variable") |>
    tab_spanner(columns = 5:6, label = "Range") |>
    fmt_number(columns = 3:6, decimals = 3) |>
    as_raw_html()
Mean SD Range Obs
Min Max
Africa
Population 24.561 35.901 0.098 206.140 54
Area 54.444 59.218 0.046 238.174 54
GDP_per_capita 0.251 0.313 0.006 1.727 54
PPP_per_capita 0.567 0.602 0.073 2.779 52
HDI_2018 0.553 0.109 0.377 0.801 53
Polity_Score 2.479 5.002 −9.000 10.000 48
FH_Total 41.574 25.130 2.000 92.000 54
America
Population 28.736 66.285 0.053 334.309 36
Area 108.161 245.852 0.026 915.802 36
GDP_per_capita 1.253 1.270 0.075 6.445 36
PPP_per_capita 1.810 1.260 0.177 6.179 35
HDI_2018 0.742 0.091 0.466 0.922 36
Polity_Score 6.926 3.594 −5.000 10.000 27
FH_Total 71.917 22.428 14.000 98.000 36
Asia
Population 107.300 301.727 0.437 1,447.470 42
Area 70.198 155.925 0.030 938.929 42
GDP_per_capita 1.317 1.706 0.049 6.368 42
PPP_per_capita 2.273 2.407 0.140 9.525 41
HDI_2018 0.723 0.120 0.463 0.935 41
Polity_Score 0.342 7.484 −10.000 10.000 38
FH_Total 38.929 25.155 0.000 96.000 42
Europe
Population 17.113 29.057 0.001 145.934 50
Area 46.462 230.347 0.000 1,637.687 50
GDP_per_capita 3.558 3.865 0.296 18.318 49
PPP_per_capita 3.778 2.128 0.843 11.342 46
HDI_2018 0.861 0.063 0.711 0.954 46
Polity_Score 7.927 4.233 −7.000 10.000 41
FH_Total 79.429 22.702 10.000 100.000 49
Oceania
Population 10.047 10.814 0.896 25.500 4
Area 210.431 372.291 1.827 768.230 4
GDP_per_capita 2.658 2.601 0.279 5.462 4
PPP_per_capita 2.757 2.198 0.417 5.000 4
HDI_2018 0.781 0.186 0.543 0.938 4
Polity_Score 7.250 3.202 4.000 10.000 4
FH_Total 79.000 20.801 60.000 97.000 4

 表としては同じ表であるが、Variable列の右側に垂直線が出力される。ちなみにこれによって、列番号がずれることはないので安心しよう。

セルの色分け

行・列のハイライト

 続いて、セルを色塗りする方法を紹介する。まず、gt()を使用し、df3の表を作成し、Population列からFH列までの値を小数点3桁までにする。作成した表はdf3_tblという名で格納し、出力してみよう。

df3_tbl <- df3 |>
  gt() |>
  fmt_number(columns = Population:FH, decimals = 3)

df3_tbl |>
  as_raw_html()
Continent Population Area GDP PPP HDI Polity FH
Africa 24.561 54.444 0.251 0.567 0.553 2.479 41.574
America 28.736 108.161 1.253 1.810 0.742 6.926 71.917
Asia 107.300 70.198 1.317 2.273 0.723 0.342 38.929
Europe 17.113 46.462 3.558 3.778 0.861 7.927 79.429
Oceania 10.047 210.431 2.658 2.757 0.781 7.250 79.000

 まずは、特定のを色塗りする方法を紹介する。使用する関数は{gtExtras}のgt_highlight_rows()関数である。必須引数はrowsであり、ここにハイライトしたい行の位置を指定する。たとえば、3行目をハイライトしたい場合はrows = 3とする。

df3_tbl |>
  gt_highlight_rows(rows = 3) |>
  as_raw_html()
Continent Population Area GDP PPP HDI Polity FH
Africa 24.561 54.444 0.251 0.567 0.553 2.479 41.574
America 28.736 108.161 1.253 1.810 0.742 6.926 71.917
Asia 107.300 70.198 1.317 2.273 0.723 0.342 38.929
Europe 17.113 46.462 3.558 3.778 0.861 7.927 79.429
Oceania 10.047 210.431 2.658 2.757 0.781 7.250 79.000

 ハイライトの色と文字の太さはそれぞれfill(既定値は"#80BCD8")とfont_weight(既定値は"bold")引数で指摘できる。font_weight"normal""bold""lighter""bolder"のように指定することも、1以上1000以下の数値で指定することもできる。

df3_tbl |>
  gt_highlight_rows(rows = 3, fill = "gray80", font_weight = "normal") |>
  as_raw_html()
Continent Population Area GDP PPP HDI Polity FH
Africa 24.561 54.444 0.251 0.567 0.553 2.479 41.574
America 28.736 108.161 1.253 1.810 0.742 6.926 71.917
Asia 107.300 70.198 1.317 2.273 0.723 0.342 38.929
Europe 17.113 46.462 3.558 3.778 0.861 7.927 79.429
Oceania 10.047 210.431 2.658 2.757 0.781 7.250 79.000

 また、rows引数は行の番号でなく、条件式を使うこともできる。たとえば、HDI列の値が0.75以上の行をハイライトしたい場合はrows = (HID >= 0.75)のように指定する。()はなくても良いが、可読性が落ちるので入れておこう。

df3_tbl |>
  gt_highlight_rows(rows = (HDI >= 0.75)) |>
  as_raw_html()
Continent Population Area GDP PPP HDI Polity FH
Africa 24.561 54.444 0.251 0.567 0.553 2.479 41.574
America 28.736 108.161 1.253 1.810 0.742 6.926 71.917
Asia 107.300 70.198 1.317 2.273 0.723 0.342 38.929
Europe 17.113 46.462 3.558 3.778 0.861 7.927 79.429
Oceania 10.047 210.431 2.658 2.757 0.781 7.250 79.000

 続いて列のハイライト方法を紹介する。使用する関数はgt_hightlight_cols()であり、これは以上にて紹介したgt_highlight_rows()と使い方は同じである。ただし、列を指定する引数がrowsでなく、columnsであることに注意すること。また、columns実引数として条件式は使用できない。以下はdf3_tblPolity列からFH列までを"#ACB3CC"色にハイライトした例である。

df3_tbl |>
  gt_highlight_cols(columns = Polity:FH,
                    fill    = "#ACB3CC") |>
  as_raw_html()
Continent Population Area GDP PPP HDI Polity FH
Africa 24.561 54.444 0.251 0.567 0.553 2.479 41.574
America 28.736 108.161 1.253 1.810 0.742 6.926 71.917
Asia 107.300 70.198 1.317 2.273 0.723 0.342 38.929
Europe 17.113