2014/06/03
データいろいろ
 >  PostgreSQL と R それぞれの指数表記化
R を含めプログラミング言語の多くは sprintf 関数を備え、指数表記に限らず様々なフォーマッティングができる。PostgreSQL は sprintf がない代わりに to_char という関数があるが、使い方がやや違う。同関数の詳細は下記を、それぞれのバージョンは 2014/04/17 を参照。

PostgreSQL 9.3.2文書 : データ型書式設定関数
http://www.postgresql.jp/document/9.3/html/functions-formatting.html

↓ 第一引数に値を、第二引数に書式を渡すのが to_char の基本(sprintf とは順番が逆)。有効桁数四桁の指数表記の場合、書式は .000EEEE または 0.000EEEE になる。小数部の桁数分のゼロを入力しなければいけない。


桁数分のゼロを入力せず数値で指定したい。また to_char はデフォルトで先頭に半角空白を入れてしまう。指数表記以外なら先頭に FM を入れて回避できるが…。あと e が小文字なのも気になると言えば気になる。これらをクエリで何とかしようとすると ↓
SELECT translate(to_char(column1
, concat('.', repeat('0', column2 - 1)
, 'EEEE')), 'e ', 'E')
FROM (
VALUES (160.0, 4) -- 一番目が数値, 二番目が有効桁数
) x ;


↓ 同じ有効桁数で、複数の値をまとめて指数表記にする場合。
WITH a AS (
VALUES (98765 :: numeric)
, (98.765), (0.987654321), (160.0) -- 数値
), b AS (
VALUES (4) -- 有効桁数
)
SELECT a.column1
, translate(to_char(a.column1
, concat('.', repeat('0', b.column1 - 1), 'EEEE'))
, 'e ', 'E')
FROM a, b ;


ずいぶん面倒になってしまった。一方 R で sprintf 関数を使うと ↓


一行で済む。ただ、上の結果をよく見ると 98765 と 98.765 で丸め方が違う。前者は切り捨て、後者は(普通の四捨五入どおり)切り上げになっている。丸め方における 5 の扱いには様々な流儀があるが、その関係なのか不明。R での挙動をもう少し調べて別記事に書く。
<< PostgreSQL と R 四捨五入と銀行丸め
時系列の欠損値をウィンドウ関数で… >>