jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

Rのtable関数の出力表をもっと「表らしく」するには?

今回も,Rを利用したデータ解析の細かい話です。
Rで2つのカテゴリー変数のクロス集計表(それぞれの変数の値の組み合わせ度数を数えたもの)はtable関数簡単に求められます。

data <- data.frame(x = sample(1:5,100, replace = TRUE), y= sample(c("a","b","c"),100, replace = TRUE))
table(data)

f:id:jnobuyuki:20171214154045p:plain

簡単だけど,この出力はそれほど便利ではありません。罫線が引かれていないし,値をMSエクセルなどに転記して,表を作らなければ見た目があまりよくないと感じます。では,表としての見栄えを改善する方法はないでしょうか?

xtable関数はどうか?

xtableパッケージの中にあるxtable関数を使えば,表をtex形式やhtml形式で出力できます。

#xtableパッケージを未インストールならインストール
intall.packages("xtable")
#xtableパッケージの起動
library(xtable)

#tex形式で出力するなら
print(xtable(table(data)),type = "latex")

これで以下のような出力が得られます。
% latex table generated in R バージョン番号 by xtable バージョン番号 package
% 作成年月日
\begin{table}[ht]
\centering
\begin{tabular}{rrrr}
\hline
& a & b & c \\
\hline
1 & 7 & 9 & 8 \\
2 & 5 & 7 & 4 \\
3 & 8 & 6 & 7 \\
4 & 3 & 10 & 6 \\
5 & 9 & 8 & 3 \\
\hline
\end{tabular}
\end{table}

この出力はPCにtex環境がインストールされている必要があります。

print(xtable(table(data)),type = "html")

html形式で出力すると以下のようなタグ付きの出力が生成されます。はてなブログではhtmlなので表として表現されますね。

<!-- html table generated in R バージョン番号 by xtableバージョン番号 package -->
<!-- Thu Dec 14 15:47:29 2017 -->
<table border=1>
<tr> <th>  </th> <th> a </th> <th> b </th> <th> c </th>  </tr>
  <tr> <td align="right"> 1 </td> <td align="right">   7 </td> <td align="right">   9 </td> <td align="right">   8 </td> </tr>
  <tr> <td align="right"> 2 </td> <td align="right">   5 </td> <td align="right">   7 </td> <td align="right">   4 </td> </tr>
  <tr> <td align="right"> 3 </td> <td align="right">   8 </td> <td align="right">   6 </td> <td align="right">   7 </td> </tr>
  <tr> <td align="right"> 4 </td> <td align="right">   3 </td> <td align="right">  10 </td> <td align="right">   6 </td> </tr>
  <tr> <td align="right"> 5 </td> <td align="right">   9 </td> <td align="right">   8 </td> <td align="right">   3 </td> </tr>
   </table>

a b c
1 7 9 8
2 5 7 4
3 8 6 7
4 3 10 6
5 9 8 3


これなら表貼り付けもできそうですね。

番外編:やっぱりエクセルを利用する

クロス集計表の計算自体はRにやらせて,結果をエクセルで読み込めば良いかもしれません。その場合は,以下のようにwrite.table関数を利用すると便利です。

write.table(table(data),"filename.txt", quote = FALSE, sep = ",")

これでできたfilename.txtをエクセルで読み込んだら,あとは罫線を引いて,幅を整えてできあがりです。

番外編その2: RStudioならrmd形式でマークダウンの表を使う

.rmd形式では|と-をつかって表を作成できます。

||a|b|c|
|---|---|---|---|
|1|7|9|8|
|2|5|7|4|
|3|8|6|7|
|4|3|10|6|
|5|9|8|3|
a b c
1 7 9 8
2 5 7 4
3 8 6 7
4 3 10 6
5 9 8 3