tableone

医学論文の患者さんのcharacteristicsをまとめたいわゆる「Table 1」を簡単に作成するためのパッケージ吉田和樹さんが作られている。多分便利なのでPython版も存在する。

finalfitパッケージの方が最終的には解析も含めてできるのでお手軽そうだが、現状では

  • total と stratのマージがうまくできない
  • meanを使うかmedianを使うかが個別に設定できない

という大きな問題点もあり、これが解決されるまではこちらを利用することになりそう。

CreateTableOne()

CreateTableOne(
    vars,
    strata,
    data,
    factorVars,
    includeNA = FALSE,
    test = TRUE,
    testApprox = chisq.test,
    argsApprox = list(correct = TRUE),
    testExact = fisher.test,
    argsExact = list(workspace = 2 * 10^5),
    testNormal = oneway.test,
    argsNormal = list(var.equal = TRUE),
    testNonNormal = kruskal.test,
    argsNonNormal = list(NULL),
    smd = TRUE)

全体・層別の両方を統合した表を作成する

これがオプション一発とかでできるとありがたいのだが。alfredのsnipetにRtable1 で展開されるようにテンプレート登録済み

  1. 必要なパッケージを読み込み
  2. データ読み込み、利用する変数をdplyr::select()で選択、必要なら変数作成
  3. labelled::var_label()で変数に出力用のラベルを設定
  4. 各種変数リストを作成
  5. nonnormalVars:非正規分布する変数
  6. factorVars:数値として入っているカテゴリカル変数のリスト
  7. cramVars:1行で表示したいカテゴリ変数のリスト
  8. exactVars:exact testで扱いたい変数のリスト
  9. stratVar:層別化したい変数
  10. 全体および層別のtableoneオブジェクトを生成する
  11. そのprint出力をオブジェクトに格納
  12. cbindを用いてmatrixを結合
  13. knitr::kable()kableExtra::kable_as_image\[\LaTeX\]的な表をpng出力

    # 全体および層別のtableoneオブジェクトを作成 total1 <- tableone::CreateTableOne(data = d1) strat1 <- tableone::CreateTableOne(data = d1, strat = stratVar)

    # print出力をオブジェクトに格納 # https://github.com/kaz-yos/tableone/issues/10 total1.matrix <- print(total1, printToggle = FALSE, noSpaces = TRUE, varLabels = TRUE, explain = TRUE, nonnormal = nonnormalVars, cramVars = cramVars)

    strat1.matrix <- print(strat1, printToggle = FALSE, noSpaces = TRUE, varLabels = TRUE, explain = TRUE, nonnormal = nonnormalVars, cramVars = cramVars, exact = exactVars)

    # cbindでmatrixを結合 table1 <- cbind(total1.matrix, strat1.matrix) # readr::write_rds(table1, “data/table1.RDS”)

tableoneでlabelの使用

いちいち変数をrenameするのは大変。Ver 0.9.0でlabelled::var_labelによるラベルのサポートが開始。printの中でvarLabels = TRUEとしてやれば良い。

Release Variable Label Support · kaz-yos/tableone

var_labelの使い方

もちろん一つずつ設定もできるが

var_label(iris$Sepal.Length) <- "Length of sepal"

まとめて設定することもできる。

var_label(iris) <- list(Petal.Length = "Length of petal",
                        Petal.Width = "Width of Petal")

行名の「(mean (sd))」を消すには

printexplain = FALSEを指定すれば消すことができる。

kableでLaTeX出力

kablekableExtraを利用して表を\[\LaTeX\]→png出力する際のメモ

\[\LaTeX\]っぽい表をpngファイルとして出力する

  1. knitr::kable()format = "``latex``"を指定して出力
    1. row.names = FALSE, align = c(``"``l``"``, "``l``"``, "``r``"``, "``r``"``, "``r``"``)などは適宜設定
    2. booktabs = TRUEにするのが大抵の場合綺麗に出力される
    3. この時の5行ごとのスペースを消すにはlinesep = ""を追加する
  2. kableExtra::kable_as_image()でpngファイルとして出力
    1. 基本的にはkable_as_image(``"``table1``"``)とすればtable1.pngとして出力される
    2. \[\LaTeX\]的にどうなっているか確認するにはkeep_tex = TRUEにして中間ファイルを確認する

出力例

kable(x, format = "latex", row.names=FALSE, align=c("l", "l", "r", "r", "r"),
     caption = "Table1 in LaTeX format", booktabs = T, linesep = "") %>% 
kableExtra::kable_as_image(filename = NULL, file_format = "png",
               latex_header_includes = NULL, keep_pdf = FALSE, density = 300,
               keep_tex = FALSE)

実際の使用時にはこのくらいの記載で良い

table1 %>%
  as.data.frame() %>%
  kable("latex", row.names=FALSE, align=c("l", "l", "r", "r", "r"),
     caption = "Table1 in LaTeX format", booktabs = T, linesep = "") %>% 
  kable_as_image("table1")

各種フォーマット方法

Create Awesome LaTeX Table with knitr::kable and kableExtra が実例を見ながら確認できる。

booktabsフォーマットスタイル

booktabs = Tとしてbooktabsスタイルを利用すると基本的には見栄えが良くなる。この時デフォルトのkable()ではlinesep = if (booktabs) c('', '', '', '', '\\addlinespace') else '\\hline'が設定されており、表の中の5行ごとに少し空白が入るようになっている(これはこれで見やすいが)。これをなくすためにはlinesep = ""などとしてしまえば良い。

\[\LaTeX\]的なフォーマットがどうなっているか確認するためには、

kableExtra::kable_as_image(…, keep_tex = TRUE)

としてやれば中間ファイルの.texファイルが残るのでそれを見て確認すれば良い。

ヘッダーの一部の書式調節など

Set col names and headers (above) to weird characters for tables with knitr, kableExtra and Latex in R markdown - Stack Overflow

escape = FALSEにすると$$を使って数式表現できる?

図表のキャプション番号の手動変更

\[\LaTeX\]なので基本的には図表の番号は自動でついていくが、実際には手動で番号を変更したい場合がある(よくある)。