gt入門
はじめに
- 以下の内容は現在執筆中の内容の一部となります。
- 本記事で使用するデータは以下からダウンロードしてください。
ファイル名 | ダウンロード |
---|---|
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出力に関しては引数の追加などで簡単にできるため、詳細は各パッケージの公式ページやヴィネット等を参考されたい。
それではまず、実習に使用するパッケージとデータを読み込でおこう。
# 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
# 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
# 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 )、それぞれの要素を追加したり、修正する形で表を作成する。
まず、これまで使ってきたdf1
を使ってHTML形式の表を出力してみよう。使用する関数はgt()
であり、data.frameまたはtibbleオブジェクト名が第1引数である。
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を指定してみよう。
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
は列の番号じゃなく、列名そのままでも指定できる。
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()
の後ろにレイヤーが足される場合はエラーが発生する。
Variable | Mean | SD | Min | Max | Obs |
---|---|---|---|---|---|
このas_raw_html()
は必要に応じて入れる。R Markdown/Quartoを使わない場合はそもそも不要だ(RStudioのViewerペインでは問題なく表示される)。もし、R Markdown/Quartoで{gt}を使用し、表の幅が気に入らない場合のみ使うことにしよう。
タイトル・フットノート
表のタイトルおよびサブタイトルはtab_header()
関数のtitle
とsubtitle
引数で指定できる。また、表の下段に位置するフットノート(footnote)とソースノート(source note)は別の関数に対応し、それぞれtab_footnote()
とtab_source_note()
を使う。使用する引数はそれぞれfootnote
とsource_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 |
---|---|---|---|---|---|
出典: 『私たちの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 |
---|---|---|---|---|---|
出典: 『私たちの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 |
---|---|---|---|---|---|
出典: 『[私たちの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 |
---|---|---|---|---|---|
出典: 『私たちのR』 | |||||
注1: ここにはフットノート1が入る | |||||
注2: ここにはフットノート2が入る |
グループ化
列をグループ化するためにはtab_spanner()
関数を使う。columns
引数にはグループ化する列の位置、もしくは名前を、label
にはグループ名を指定すれば良い。たとえば、df1
を使う場合、Min
とMax
列を一つのグループとしてRangeと名付けるとしよう。columns
は列の番号でも、列名でも良い。
df1 |>
gt() |>
tab_spanner(columns = 4:5, label = "Range") |>
fmt_number(columns = 2:5, decimals = 3) |>
as_raw_html()
Min | Max |
---|---|
続いて、行をグループ化する方法について紹介する。まず、df2
の中身を確認してみよう。
各大陸ごとの人口、面積などの情報が含まれている表であるが、これらを大陸単位で行をグループ化してみよう。方法は簡単だ。{dplyr}のようにgt()
関数に渡す前に、group_by()
でデータをグループ化すれば良い。今回はContinent
列の値に基づいてグループ化するため、group_by(Continent)
とする。
Variable | Mean | SD | Min | Max | Obs |
---|---|---|---|---|---|
Africa | |||||
America | |||||
Asia | |||||
Europe | |||||
Oceania | |||||
このようにグループ化することができる。引き続きMean
列からMax
列までの値を小数点3桁目で丸めてみよう。Mean
とMax
列の位置は2、5列目であるかのように見える。とりあえずやってみよう。
Variable | Mean | SD | Min | Max | Obs |
---|---|---|---|---|---|
Africa | |||||
America | |||||
Asia | |||||
Europe | |||||
Oceania | |||||
このようにエラーが表示される。なぜだろう。それはグルーピングに使用された変数も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()
Min | Max | ||||
---|---|---|---|---|---|
Africa | |||||
America | |||||
Asia | |||||
Europe | |||||
Oceania | |||||
ややこしい話であるが、列を番号でなく、列名で指定すると、このような混乱を避けることができる。列の指定方法は好みの問題でもあるので、好きなやり方を使おう。
df2 |>
group_by(Continent) |>
gt() |>
tab_spanner(columns = Min:Max, label = "Range") |>
fmt_number(columns = Mean:Max, decimals = 3) |>
as_raw_html()
Min | Max | ||||
---|---|---|---|---|---|
Africa | |||||
America | |||||
Asia | |||||
Europe | |||||
Oceania | |||||
最後に、グルーピングとは関係ないものの、行の名前を指定する方法について説明する。それは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()
Min | Max | ||||
---|---|---|---|---|---|
Africa | |||||
Population | |||||
Area | |||||
GDP_per_capita | |||||
PPP_per_capita | |||||
HDI_2018 | |||||
Polity_Score | |||||
FH_Total | |||||
America | |||||
Population | |||||
Area | |||||
GDP_per_capita | |||||
PPP_per_capita | |||||
HDI_2018 | |||||
Polity_Score | |||||
FH_Total | |||||
Asia | |||||
Population | |||||
Area | |||||
GDP_per_capita | |||||
PPP_per_capita | |||||
HDI_2018 | |||||
Polity_Score | |||||
FH_Total | |||||
Europe | |||||
Population | |||||
Area | |||||
GDP_per_capita | |||||
PPP_per_capita | |||||
HDI_2018 | |||||
Polity_Score | |||||
FH_Total | |||||
Oceania | |||||
Population | |||||
Area | |||||
GDP_per_capita | |||||
PPP_per_capita | |||||
HDI_2018 | |||||
Polity_Score | |||||
FH_Total |
表としては同じ表であるが、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 |
---|---|---|---|---|---|---|---|
まずは、特定の行を色塗りする方法を紹介する。使用する関数は{gtExtras}のgt_highlight_rows()
関数である。必須引数はrows
であり、ここにハイライトしたい行の位置を指定する。たとえば、3行目をハイライトしたい場合はrows = 3
とする。
Continent | Population | Area | GDP | PPP | HDI | Polity | FH |
---|---|---|---|---|---|---|---|
ハイライトの色と文字の太さはそれぞれfill
(既定値は"#80BCD8"
)とfont_weight
(既定値は"bold"
)引数で指摘できる。font_weight
は"normal"
、"bold"
、"lighter"
、"bolder"
のように指定することも、1以上1000以下の数値で指定することもできる。
Continent | Population | Area | GDP | PPP | HDI | Polity | FH |
---|---|---|---|---|---|---|---|
また、rows
引数は行の番号でなく、条件式を使うこともできる。たとえば、HDI
列の値が0.75以上の行をハイライトしたい場合はrows = (HID >= 0.75)
のように指定する。()
はなくても良いが、可読性が落ちるので入れておこう。
Continent | Population | Area | GDP | PPP | HDI | Polity | FH |
---|---|---|---|---|---|---|---|
続いて列のハイライト方法を紹介する。使用する関数はgt_hightlight_cols()
であり、これは以上にて紹介したgt_highlight_rows()
と使い方は同じである。ただし、列を指定する引数がrows
でなく、columns
であることに注意すること。また、columns
実引数として条件式は使用できない。以下はdf3_tbl
のPolity
列からFH
列までを"#ACB3CC"
色にハイライトした例である。
セルの色分け
以上の例は「行」と「列」のハイライトであった。ここでは「セル」に注目する。セルの色塗りには2つのケースがある。1つ目は特定のセルをハイライトすることであり、2つ目は値に応じて色分けをすることである。まず、特定のセルを強調したい場合はgt_hightlight_rows()
関数を使用する。ただし、rows
引数のみだと全列がハイライトされてしまうので、今回は更にcolumns
引数も追加し、「何行目、何列目のセル」かを特定する必要がある。
Continent | Population | Area | GDP | PPP | HDI | Polity | FH |
---|---|---|---|---|---|---|---|
セルの値に応じて色分けをする場合はgt_color_rows()
関数を使う。たとえば、Population
列(2列目)の値に応じて色分けをするなら、columns = Population
、またはcolumns = 2
を指定する。
Warning: Domain not specified, defaulting to observed range within each
specified column.
Warning: Since gt v0.9.0, the `colors` argument has been deprecated.
• Please use the `fn` argument instead.
This warning is displayed once every 8 hours.
Continent | Population | Area | GDP | PPP | HDI | Polity | FH |
---|---|---|---|---|---|---|---|
謎の警告メッセージが表示された。これはPopulation
が取りうる値の範囲が必要であることを意味する。これが省略されても表の作成には問題はないが、できればdomain
引数に、c(最小値, 最大値)
の実引数を指定しよう。指定しない場合は既定値はPopulation
列の最小値と最大値が指定される。たとえば、Population
が(理論上)取りうる値が10から110までであれば、domain = c(0, 110)
のように指定する。このdomain
はなくても一応表は作れるので、以降は省略する。
Continent | Population | Area | GDP | PPP | HDI | Polity | FH |
---|---|---|---|---|---|---|---|
ちなみに、色についても説明する。デフォルトの色は赤系であり、数値が高いほど赤くなる。この色はpalette
で指定することができる。既定値は{ggsci}パッケージが提供するred_material
というパレットだ({ggsci}パッケージは{gtExtras}パッケージと一緒にインストールされる)。特定のパッケージが提供するパレットであれば"パッケージ名::パレット名"
と指定する。たとえば、Population
列からFH
列まで色分けをし、{ggsci}のblue_material
パレットを使う場合はpalette = "ggsci::blue_material"
のように指定する必要がある。
Continent | Population | Area | GDP | PPP | HDI | Polity | FH |
---|---|---|---|---|---|---|---|
{ggsci}は他にも様々なパレットを提供しているが、詳細は公式レファレンスを参照されたい。また、{ggsci}以外のパッケージが提供するパレットも使える。定番の{RColorBrewer}パッケージも様々なパレットを提供しており、以下の例はYlOrRd
パレットを使った例だ。
Continent | Population | Area | GDP | PPP | HDI | Polity | FH |
---|---|---|---|---|---|---|---|
{RColorBrewer}が提供するパレットの例はコンソール上でRColorBrewer::display.brewer.all()
と打つと出力される。
表の出力
{gt}で作成した表は様々なフォーマットで出力することができる。現在(2023年08月29日; {gt} 0.9.0)、Microsoft Word(.docx
)、\(\LaTeX\)(.tex
)、ハイパーテキスト(.html
)、リッチテキスト(.rtf
)、画像(.png
)形式で出力可能だ。ここでは簡単な例を紹介する。
まず、{gt}を使って表を作成し、オブジェクトとして作業環境内に格納する。ここではgt_table
と名付けた。この場合、as_raw_html()
は不要だ。
gt_table <- 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/)』"))
gt_table
タイトル | |||||
サブタイトル | |||||
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が入る |
このgt_table
を保存する関数はgtsave()
である。第1引数は先ほど作成した表のオブジェクト名、第2引数は出力するファイル名である。このファイル名の拡張子によって保存されるファイルのフォーマットが変わる。結果をここで見せることは難しいが、難しい作業ではないので各自やってみよう。
番外編: データの出力
PDF、Microsoft Word形式の文書を作成する場合、生データ(raw data)を掲載することはめったにないだろう。数十行のデータなら掲載することもあるが2、規模の大きいデータセットの場合、資源(紙)の無駄遣いとなる。しかし、HTMLフォーマットの文書なら話は別だ。ファイルの容量は大きくなるものの、生データを全て掲載することもできる。
そこまで大きいデータセットではないが、たとえばdf2
をR Markdown / QuartoのHTML文書に掲載するとしよう。この場合、まず考えられるのは普通にdf2
を出力することだ。ただし、df2
のクラスによって出力結果がややことなる。たとえば、df2
はread_csv()
関数で読み込んだデータであるため、data.frameでなく、tibbleである。実際にクラスを確認してみよう。「クラス(class)」の概念についてはオブジェクト志向型プログラミングの記事を参照されたい。
data.frameクラスを継承しているが、クラスに"tbl"
や"tbl_df"
も含まれており、これはdf2
がtibble形式であることを意味する。これをこのまま出力してみよう。
# 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
tibble形式のデータは通常、最初の10行のみ出力される。また、小数点も2〜3桁目で丸められる。もう一つの特徴としては横に長い表の場合(つまり、列が多い場合)、一部の列は省略される(省略された列の簡単な情報は表示される)。このようにtibbleクラスのデータは読みやすく出力される長所があるものの、全てのデータが出力されないケースもある。
一方、read_csv()
でなく、read.csv()
で読み込んだ表形式データのクラスはdata.frameだ。df2
をas.data.frame()
関数を使ってdata.frameクラスに変更してみよう。クラスを変更したdf2
はdf4
と名付ける。
それではdf4
を出力してみよう。
Continent Variable Mean SD Min Max
1 Africa Population 24.5609472 35.90062114 0.098347000 206.139589
2 Africa Area 54.4435111 59.21810613 0.046000000 238.174000
3 Africa GDP_per_capita 0.2514072 0.31334566 0.005770007 1.727394
4 Africa PPP_per_capita 0.5667087 0.60151933 0.073314173 2.778814
5 Africa HDI_2018 0.5532642 0.10889924 0.377000000 0.801000
6 Africa Polity_Score 2.4791667 5.00208290 -9.000000000 10.000000
7 Africa FH_Total 41.5740741 25.12955251 2.000000000 92.000000
8 America Population 28.7362271 66.28460983 0.053199000 334.308644
9 America Area 108.1607833 245.85173673 0.026000000 915.802000
10 America GDP_per_capita 1.2526519 1.27016543 0.074535927 6.444591
11 America PPP_per_capita 1.8100292 1.26006234 0.176587508 6.178997
12 America HDI_2018 0.7424722 0.09094975 0.466000000 0.922000
13 America Polity_Score 6.9259259 3.59407553 -5.000000000 10.000000
14 America FH_Total 71.9166667 22.42750225 14.000000000 98.000000
15 Asia Population 107.3001606 301.72686527 0.437479000 1447.470092
16 Asia Area 70.1983405 155.92487158 0.030000000 938.929100
17 Asia GDP_per_capita 1.3167525 1.70584531 0.049067972 6.368026
18 Asia PPP_per_capita 2.2728133 2.40667620 0.139610508 9.525177
19 Asia HDI_2018 0.7228537 0.12010715 0.463000000 0.935000
20 Asia Polity_Score 0.3421053 7.48431266 -10.000000000 10.000000
21 Asia FH_Total 38.9285714 25.15453977 0.000000000 96.000000
22 Europe Population 17.1127533 29.05674254 0.000801000 145.934462
23 Europe Area 46.4618980 230.34717622 0.000000000 1637.687000
24 Europe GDP_per_capita 3.5575266 3.86463361 0.296369600 18.317721
25 Europe PPP_per_capita 3.7782593 2.12763785 0.842873869 11.342306
26 Europe HDI_2018 0.8611304 0.06306914 0.711000000 0.954000
27 Europe Polity_Score 7.9268293 4.23314448 -7.000000000 10.000000
28 Europe FH_Total 79.4285714 22.70187217 10.000000000 100.000000
29 Oceania Population 10.0465332 10.81385119 0.896445000 25.499884
30 Oceania Area 210.4312500 372.29122053 1.827000000 768.230000
31 Oceania GDP_per_capita 2.6577585 2.60067976 0.279082855 5.461517
32 Oceania PPP_per_capita 2.7572651 2.19837188 0.417111768 5.000127
33 Oceania HDI_2018 0.7815000 0.18631604 0.543000000 0.938000
34 Oceania Polity_Score 7.2500000 3.20156212 4.000000000 10.000000
35 Oceania FH_Total 79.0000000 20.80064102 60.000000000 97.000000
Obs
1 54
2 54
3 54
4 52
5 53
6 48
7 54
8 36
9 36
10 36
11 35
12 36
13 27
14 36
15 42
16 42
17 42
18 41
19 41
20 38
21 42
22 50
23 50
24 49
25 46
26 46
27 41
28 49
29 4
30 4
31 4
32 4
33 4
34 4
35 4
今回は全ての行と列が出力された。そもそも生データを掲載するのが目的であれば、tibbleクラスよりも、data.frameクラスが目的に合致する。しかし、読みにくいという深刻な問題がある。また、世論調査データのように数千行、変数も数十列以上あるデータセットを出力するとあまりにも長い画面になってしまう。
ここで便利なのが{DT}パッケージのdatatable()
関数だ。全ての行と列を読みやすい形式で出力してくれる。
このように情報が損失されることなく、非常に読みやすい表になった。これで十分かも知れないが、小数点を丸めたい人もいるかも知れないので、その方法を紹介する。具体的にはdataframe()
で作成した表をformatRound()
関数に渡すだけだ。formatRound()
関数の引数はcolumns
とdigits
があり、それぞれ適用する列と小数点を桁数を指定すればよい。
注
kable()
+ {kableExtra}の使い方については、インターネット上のヴィネットを参考されたい。↩︎どうでも良い話だが、Arend LijphartのPattern of Democracyの場合(邦訳:『民主主義対民主主義』)、データセットがMicrosoft Word形式で公開されている…。↩︎