RでMySQL風に出力する

去年 Rの文字出力に便利な関数を作ってみた - あらびき日記 というエントリーを書きましたが、print.mysqlike 関数を改良しました。
print.mysqlike.R at master from abicky/R_funcs - GitHub/print.mysqlike.R

変更点

  • 同じ列の数値は小数点以下の桁数を揃えて出力するようにしました
  • 桁数が大きい場合などは自動的に指数表記になります
  • 引数の名前や順番を変更しました(前回のバージョンを使っている人は注意が必要です)
  • index のデフォルト値をTRUEに変更しました
  • digits 引数を指定することで列ごとに小数点以下の有効桁数を指定できるようになりました
  • file 引数を指定することでファイルに保存できるようになりました
  • 行列に行名がある場合は name という列を左端に付与します(row.namesで調整できます)
    ※上2つの項目は5月ぐらいに変更しましたが、バグがあったのと非効率だったので修正しました

デモ

前のバージョンでは小数の列の中に整数が存在していた場合に小数点以下の桁数が揃わなかったのですが修正しました。

> print.mysqlike(head(iris))
+---+--------------+-------------+--------------+-------------+---------+
|   | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
+---+--------------+-------------+--------------+-------------+---------+
| 1 |          5.1 |         3.5 |          1.4 |         0.2 | setosa  |
| 2 |          4.9 |         3.0 |          1.4 |         0.2 | setosa  |
| 3 |          4.7 |         3.2 |          1.3 |         0.2 | setosa  |
| 4 |          4.6 |         3.1 |          1.5 |         0.2 | setosa  |
| 5 |          5.0 |         3.6 |          1.4 |         0.2 | setosa  |
| 6 |          5.4 |         3.9 |          1.7 |         0.4 | setosa  |
+---+--------------+-------------+--------------+-------------+---------+

表示桁数が揃っていてのがキレイですね!

digits引数で小数点以下の有効桁数を指定できます。

> print.mysqlike(head(iris), digits = 0)
+---+--------------+-------------+--------------+-------------+---------+
|   | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
+---+--------------+-------------+--------------+-------------+---------+
| 1 |            5 |           4 |            1 |           0 | setosa  |
| 2 |            5 |           3 |            1 |           0 | setosa  |
| 3 |            5 |           3 |            1 |           0 | setosa  |
| 4 |            5 |           3 |            2 |           0 | setosa  |
| 5 |            5 |           4 |            1 |           0 | setosa  |
| 6 |            5 |           4 |            2 |           0 | setosa  |
+---+--------------+-------------+--------------+-------------+---------+

列ごとに指定することもできます。

> print.mysqlike(head(iris), digits = c(0:3, NA))
+---+--------------+-------------+--------------+-------------+---------+
|   | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
+---+--------------+-------------+--------------+-------------+---------+
| 1 |            5 |         3.5 |         1.40 |       0.200 | setosa  |
| 2 |            5 |         3.0 |         1.40 |       0.200 | setosa  |
| 3 |            5 |         3.2 |         1.30 |       0.200 | setosa  |
| 4 |            5 |         3.1 |         1.50 |       0.200 | setosa  |
| 5 |            5 |         3.6 |         1.40 |       0.200 | setosa  |
| 6 |            5 |         3.9 |         1.70 |       0.400 | setosa  |
+---+--------------+-------------+--------------+-------------+---------+

列数よりも長さの小さいベクトルを指定した場合は繰り返して適用されます。

> print.mysqlike(head(iris), digits = 0:1)
+---+--------------+-------------+--------------+-------------+---------+
|   | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
+---+--------------+-------------+--------------+-------------+---------+
| 1 |            5 |         3.5 |            1 |         0.2 | setosa  |
| 2 |            5 |         3.0 |            1 |         0.2 | setosa  |
| 3 |            5 |         3.2 |            1 |         0.2 | setosa  |
| 4 |            5 |         3.1 |            2 |         0.2 | setosa  |
| 5 |            5 |         3.6 |            1 |         0.2 | setosa  |
| 6 |            5 |         3.9 |            2 |         0.4 | setosa  |
+---+--------------+-------------+--------------+-------------+---------+
Warning message:
In printMysqlikeFuncs$checkArgLength(digits, length(x)) :
  'arg' length [2] is not a multiple of the number of data [5]

※列数5がdigitsの長さ2で割り切れないので警告が出ています

出力結果を保存したいなぁと思ったら file 引数にファイル名を指定します。

> print.mysqlike(head(iris), digits = 0:1, file = "iris.txt")
Warning message:
In printMysqlikeFuncs$checkArgLength(digits, length(x)) :
  'arg' length [2] is not a multiple of the number of data [5]

※iris.txt というファイルに結果が保存されます

ちなみに数字の列と判断したら右寄せになります。

> (x <- data.frame(a = c("123", "1"), b = c("1,234,567", "1,234"), c = c("1,2,3,4", "1,2"), d = 9:10))
       a         b       c  d
1 123 1,234,567 1,2,3,4  9
2          1,234     1,2 10
> print.mysqlike(x)
+---+--------+-----------+---------+----+
|   | a      | b         | c       | d  |
+---+--------+-----------+---------+----+
| 1 | 123 | 1,234,567 | 1,2,3,4 |  9 |
| 2 |      |     1,234 | 1,2     | 10 |
+---+--------+-----------+---------+----+

長さの違うリストも表示できます。

> (x <- list(a = letters[1:2], b = LETTERS[1:4]))
$a
[1] "a" "b"

$b
[1] "A" "B" "C" "D"

> print.mysqlike(x)
+---+---+---+
|   | a | b |
+---+---+---+
| 1 | a | A |
| 2 | b | B |
| 3 |   | C |
| 4 |   | D |
+---+---+---+

そんなわけで、よかったらお使いください!