研究者: Rでロジスティック回帰を実行したのですが、コンソール画面の
summary()の数値を1つずつExcelに手入力するのが大変です。直接コピペすると1つのセルに固まって崩れてしまうのですが、簡単に綺麗な表にする方法はありますか?
統計ER:
summary()の出力はただのプレーンテキストなので崩れてしまいます。神パッケージbroom::tidy()でデータフレーム化し、clipr::write_clip()を使えば、1行でExcelのセルにぴったり分かれた状態で直接貼り付けできますよ!さっそく手順を解説しましょう!
臨床研究で単変量・多変量ロジスティック回帰分析やCox比例ハザード分析、線形回帰分析を実行した際、出力された回帰係数やオッズ比(OR)、p値をどのようにExcelへ転記しているだろうか。
まさか、Rのコンソール画面を見つめながら、1数値ずつ手入力でExcelのセルに打ち込んではいないだろうか。
「1.45」「0.048」「1.12-1.88」といった数値を手作業で転記する作業は、膨大な時間がかかるだけでなく、「p = 0.048」を「0.084」と打ち間違えるような致命的なヒューマンエラー(転記ミス)を引き起こす。学内発表ならまだしも、論文提出後にデータとの齟齬を指摘されれば、査読での重大な不信感につながってしまう。
また、コンソール画面のテキストをそのままコピーしてExcelに貼り付けようとしても、1つのセルに文章ごと固まって入力され、表として機能しない経験をした方も多いはずだ。
本記事では、手入力と転記ミスから完全に解放される「Rの解析結果を一瞬でExcelのきれいな表(セル分割済み)に出力する決定版テクニック」を解説する。
前処理や転記作業などの「内職」に時間を奪われるのをやめ、研究の本質である考察や論文執筆へ貴重な時間を投資しよう。
なぜRの標準出力 summary() はExcelにそのまま貼れないのか?
Rで線形回帰やロジスティック回帰を実行した際、最もよく使われるのが summary() 関数である。しかし、この出力結果をそのままコピーしてExcelに貼り付けると、A列の1つのセル内に文字列全体が詰め込まれて崩れてしまう。
# 例:ロジスティック回帰を実行
fit <- glm(disease ~ age + sex + sbp, data = df, family = binomial)
summary(fit)
これが起こる理由は、summary() の出力結果がデータフレーム(表形式)ではなく、画面表示用に整形された「ただのプレーンテキスト(スペース区切りの文字列)」だからである。
Excelに綺麗に貼り付けるための最大の鍵は、「Rのモデルオブジェクトを、一度綺麗なデータフレーム(tbl / data.frame)へ変換・構造化すること」にある。
解析結果をデータフレームに綺麗に変換する神パッケージ broom
モデルオブジェクトを表形式(データフレーム)に変換する際、Rユーザーの標準となっているのが broom パッケージ である。
broom::tidy() でモデルオブジェクトを一瞬で表形式にする
broom パッケージに含まれる tidy() 関数にモデル(fit)を渡すだけで、雑多なコンソール出力が列ごとに独立した美しいデータフレームへと変換される。
# パッケージの読み込み
library(tidyverse)
library(broom)
# モデル結果を綺麗なデータフレームに変換
res_df <- tidy(fit)
print(res_df)
# A tibble: 4 × 5
# term estimate std.error statistic p.value
# <chr> <dbl> <dbl> <dbl> <dbl>
# 1 (Intercept) -3.21 0.852 -3.77 0.00016
# 2 age 0.0412 0.0125 3.30 0.00097
# 3 sexMale 0.512 0.210 2.44 0.0147
# 4 sbp 0.0185 0.0062 2.98 0.0029
オッズ比・ハザード比と95%信頼区間を一括抽出するオプション
臨床研究でロジスティック回帰(glm)やCox回帰(coxph)を行う場合、回帰係数(対数オッズ)のままではなく、「オッズ比(OR)やハザード比(HR)」および「95%信頼区間(95% CI)」の形で取り出したいケースがほとんどである。
tidy() 関数に以下の2つのオプションを指定することで、指数変換(exp)と信頼区間の算出を一括で実行できる。
# オッズ比(OR)と95%信頼区間を一括抽出
res_or <- tidy(fit, exponentiate = TRUE, conf.int = TRUE)
print(res_or)
# term estimate std.error statistic p.value conf.low conf.high
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 (Intercept) 0.0403 0.852 -3.77 0.00016 0.0071 0.203
#2 age 1.04 0.0125 3.30 0.00097 1.02 1.07
#3 sexMale 1.67 0.210 2.44 0.0147 1.11 2.53
#4 sbp 1.02 0.0062 2.98 0.0029 1.01 1.03
exponentiate = TRUE: 回帰係数を指数変換し、オッズ比(OR)やハザード比(HR)へ自動変換する。conf.int = TRUE: 95%信頼区間の下限(conf.low)と上限(conf.high)を追加で出力する。
これで、データが整然と分かれた「Excelに持ち込める準備」が整った。
Rの解析結果をExcelに流し込む3つの実践テクニック
データフレームに変換した解析結果をExcelへ持ち込むには、目的や作業環境に応じて以下の3つの手法から選択するのが最も効率的である。
手法1:【最速】clipr::write_clip() でクリップボードへ直接コピー(Ctrl+Vで貼るだけ)
一番手軽でスピード重視の方法が、Rの出力データを直接クリップボードへ転送する手法である。
clipr パッケージの write_clip() 関数を使用する。
library(clipr)
# 解析結果を直接クリップボードにコピー
fit %>%
tidy(exponentiate = TRUE, conf.int = TRUE) %>%
write_clip()
このコードを実行したら、そのまま開きっぱなしのExcelシートに切り替え、貼り付けを行いたいセルで Ctrl + V(Macなら Cmd + V) を押すだけでよい。
タブ区切りの形式でクリップボードに入っているため、Excelの各セルへ完璧に分割された状態で一瞬で貼り付けが完了する。「ちょっと下書きのExcel表に数値を貼って確認したい」という日常の解析作業において最高速のテクニックである。
補足: パッケージを追加したくない場合は、Base R の
write.table(res_or, "clipboard", sep = "\t", row.names = FALSE)でも同様の操作が可能である(Windows推奨)。
手法2:【確実】openxlsx::write.xlsx() でExcelファイル(.xlsx)に直接出力
解析結果を単体ファイルとして保存・保管したい場合や、再現性を保ちたい研究データの場合は、直接 .xlsx ファイルとして書き出すのが確実である。
openxlsx パッケージの write.xlsx() 関数を使用する。
library(openxlsx)
# 解析結果をデータフレーム化
res_df <- tidy(fit, exponentiate = TRUE, conf.int = TRUE)
# Excelファイル(.xlsx)として保存
write.xlsx(res_df, file = "logistic_regression_results.xlsx")
実行すると、作業ディレクトリ内に整然としたExcelファイルが生成される。手入力を完全に介さないため、チーム内でのデータ共有や将来の解析再再現時にも不整合が起こらない。
手法3:【論文完成形】gtsummary パッケージでそのまま論文に載るテーブルを作成
「ただの数値をExcelに送るだけでなく、論文の Table 2 にそのまま使えるレベルで美しくレイアウトされた表を作りたい」という場合には、医療統計で絶大な支持を得ている gtsummary パッケージ が第一選択となる。
gtsummary::tbl_regression() を使うと、変数名のラベル表示、参照群(Reference)の自動挿入、p値の小点数切り捨て処理などが自動で適用される。
library(gtsummary)
# 論文用の高品質テーブルを作成
table_output <- fit %>%
tbl_regression(exponentiate = TRUE) %>%
add_global_p() # グローバルp値の追加など
# Excel(またはWord)へエクスポート
table_output %>%
as_hux_table() %>%
huxtable::quick_xlsx("Table2_Regression_Results.xlsx")
この方法を用いれば、フォントや罫線の整った「ほぼ論文提出完成形」の表がそのままExcel形式で手に入る。
論文投稿を見据えた「オッズ比 (95% CI)」の文字列一括整形テクニック
医学論文のTable 2などでは、「オッズ比(estimate)」「下限(conf.low)」「上限(conf.high)」が別々の列に分かれている表よりも、1.45 (1.12-1.88) のように1つの列(文字列)にまとまった形式が求められることが多い。
Excelに流し込む前の段階で、R上で数値の丸め(四捨五入)と文字列結合を一括処理しておくと、転記後の手作業による編集コストが完全にゼロになる。
library(tidyverse)
library(broom)
library(clipr)
# 論文用に一括整形するパイプライン
table_for_paper <- fit %>%
tidy(exponentiate = TRUE, conf.int = TRUE) %>%
# 切片(Intercept)を除外したい場合はフィルタリング
filter(term != "(Intercept)") %>%
mutate(
# 数値を小数点以下2桁(または適宜)に揃える
OR = sprintf("%.2f", estimate),
LCI = sprintf("%.2f", conf.low),
UCI = sprintf("%.2f", conf.high),
# "1.45 (1.12-1.88)" の形式に一括結合
`OR (95% CI)` = str_c(OR, " (", LCI, "-", UCI, ")"),
# p値の整形(0.001未満は "<0.001" と表記)
`p value` = ifelse(p.value < 0.001, "<0.001", sprintf("%.3f", p.value))
) %>%
# 必要な列だけを抽出して整列
select(Variable = term, `OR (95% CI)`, `p value`)
# クリップボードへコピー(Excelへ即貼り付け可能!)
write_clip(table_for_paper)
この処理を実行した後にExcelで Ctrl + V を押せば、投稿論文にそのまま掲載できるフォーマット(変数名 / OR (95% CI) / p value)が一瞬で完成する。
【まとめ】手入力ゼロで転記ミスのない論文執筆へ
今回紹介した「RからExcelへ直接流し込むフロー」を一度構築してしまえば、手入力に頼っていた従来の作業がいかにリスクが高く、無駄な時間であったかに気づくだろう。
- 最速で確認・作業したい時:
tidy(fit, exponentiate = TRUE, conf.int = TRUE)➔clipr::write_clip()でExcelへ貼り付け - 成果物・保存データとしたい時:
openxlsx::write.xlsx()で.xlsxファイル書き出し - 論文用の完成表を作りたい時:
gtsummary::tbl_regression()またはsprintf()による一括文字列結合
「画面を見ながら打ち込む内職時間」を完全に削減し、手入力ミスの恐怖から解放された状態で、研究のデータ考察や論文執筆へ集中していこう。





コメント