gt入門

作成日

2023年3月14日

更新日

2023年8月29日

はじめに

ファイル名 ダウンロード
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年08月29日; {gt} 0.9.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
# ℹ 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()
Variable Mean SD Min Max Obs
Africa
Population 24.561 35.901 0.098 206.139589 54
Area 54.444 59.218 0.046 238.174000 54
GDP_per_capita 0.251 0.313 0.006 1.727394 54
PPP_per_capita 0.567 0.602 0.073 2.778814 52
HDI_2018 0.553 0.109 0.377 0.801000 53
Polity_Score 2.479 5.002 −9.000 10.000000 48
FH_Total 41.574 25.130 2.000 92.000000 54
America
Population 28.736 66.285 0.053 334.308644 36
Area 108.161 245.852 0.026 915.802000 36
GDP_per_capita 1.253 1.270 0.075 6.444591 36
PPP_per_capita 1.810 1.260 0.177 6.178997 35
HDI_2018 0.742 0.091 0.466 0.922000 36
Polity_Score 6.926 3.594 −5.000 10.000000 27
FH_Total 71.917 22.428 14.000 98.000000 36
Asia
Population 107.300 301.727 0.437 1447.470092 42
Area 70.198 155.925 0.030 938.929100 42
GDP_per_capita 1.317 1.706 0.049 6.368026 42
PPP_per_capita 2.273 2.407 0.140 9.525177 41
HDI_2018 0.723 0.120 0.463 0.935000 41
Polity_Score 0.342 7.484 −10.000 10.000000 38
FH_Total 38.929 25.155 0.000 96.000000 42
Europe
Population 17.113 29.057 0.001 145.934462 50
Area 46.462 230.347 0.000 1637.687000 50
GDP_per_capita 3.558 3.865 0.296 18.317721 49
PPP_per_capita 3.778 2.128 0.843 11.342306 46
HDI_2018 0.861 0.063 0.711 0.954000 46
Polity_Score 7.927 4.233 −7.000 10.000000 41
FH_Total 79.429 22.702 10.000 100.000000 49
Oceania
Population 10.047 10.814 0.896 25.499884 4
Area 210.431 372.291 1.827 768.230000 4
GDP_per_capita 2.658 2.601 0.279 5.461517 4
PPP_per_capita 2.757 2.198 0.417 5.000127 4
HDI_2018 0.781 0.186 0.543 0.938000 4
Polity_Score 7.250 3.202 4.000 10.000000 4
FH_Total 79.000 20.801 60.000 97.000000 4

 このようにエラーが表示される。なぜだろう。それはグルーピングに使用された変数も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