データの整形 | package入門(ユーティリティー編) [講座] | 逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓rpnの実践ウェブ   
rpn hacks! アールピーエヌ・ハックスサイトマップ

rpn | 講座 | package入門 | ポテンシャルを飛躍的に高めるrpnパッケージを学習。

データの整形

 以下に4つのデータ形式を再度、表示します。

  A) 1行1列   B) m行1列   C) 1行n列           D) m行n列
  1           1           1 2 3 4 5 6 7 8 9   1 2 3 4 5 6 7 8 9
              2                               2 9 6 2 3 5 8 0 6
  |           3 ---> data2.txt    |           3 7 6 6 1 3 2 9 4
  v           4                   v           4 4 8 4 6 2 7 8 2
  data1.txt   5               data3.txt       5 0 5 5 8 4 7 7 6
              6                               6 5 1 4 8 3 5 9 5
              7               data4.txt <---  7 3 7 2 5 0 9 6 1
              8                               8 9 4 1 3 4 3 6 4
              9                               9 3 1 7 7 3 1 0 3


縦一列・横一行の相互変換

 まずは、このうちのC形式からB形式への変換を行ってみましょう。1行n列の横一行のデータからm行1列の縦一列のデータへの変換です(mとnが同じケース)。変換するためにrpnではユーティリティーパッケージにある変換用のrpnプログラムを使います。以下に例を示します。

  >rpn 1 -c fold' <data3.txt
  1
  2
  3
  4
  5
  6
  7
  8
  9


"fold'"が横一行から縦一行への変換プログラムです。Cの形式だったdata3.txtがBの形式に変わっていることが分かると思います。詳しく見てみましょう。

  >rpn 1 -c fold' <data3.txt
    ① ②③  ④       ⑤


①はrpn標準版そのものです。⑤が今回計算する数値が入っているファイル名です。③はrpnプログラムを読み込むことを示しています。④がそのrpnプログラムですね。②は④のプログラムに指定する数値です。fold'プログラムにデータの数値を1個ずつで折り返すように指定しています。

別の例で試してみましょう。今度は3で折り返してみます。

  >rpn 3 -c fold' <data3.txt
  1 2 3
  4 5 6
  7 8 9


3個のデータごとに折り返されていることが分かりますね。

逆にBの形式からCの形式にするにはどうすればいいでしょうか。答えは、同じくユーティリティーパッケージのfoldプログラムです。気付いたかもしれませんが、'(ダッシュ)が付いているプログラムはCの形式に対応したプログラムです。以下にfoldプログラムを実行した結果を示します。

  >rpn 1 -c fold <data2.txt
  1 2 3 4 5 6 7 8 9


Cの形式に変わっていますね。ちなみにfoldへの数値指定を3にすると以下のようになります。

  >rpn 3 -c fold <data2.txt
  1 4 7
  2 5 8
  3 6 9


黒点数の推移を調べる

 実践的な話題で、データの折り返しを使ってみましょう。最近、太陽の黒点数が減少しており、気候変動の可能性が指摘されていますが、ここに太陽の黒点数を調べたデータがあります。ファイル名をdata.txtとします。

  111
  127
  102
  109
  127
  106
  112
   93
   99
   86
   95
   83 


ある年の1月から12月までの平均黒点数を記録したものですが、グラフにすると黒点数は下降気味です。といっても、100以上あるので太陽が活発な時期の計測です。

  >rpn @x 1 + #x @x x <data.txt >tmp
  >xyp -x,12 -y,150 -s3,50 -m <tmp
  ^y 150
  |
  |     *         *
  |  *                  *
  -        *   *     *
  |                         *  *     *
  |                               *      *
  |
  |
  -
  |
  |
  |
  |                                      x
  |o                                    12
  +--------|---------|---------|--------->


rpn式の「rpn @x 1 + #x @x x」はdata.txtのデータに1から始まる行番号を付けています。tmpファイルには以下のようなデータが格納されます。

  1 111
  2 127
    :
  (中略)
    :
  11 95
  12 83


情報rpn式の動作を理解したい方は、rpn基礎プログラムで計算しようデータを転がして計算しようをご覧ください。rpnの動作について分かりやすく説明してあります。より詳しくrpnについて知りたい方は、rpn入門も参考にしてください。

行番号を付加したデータをxypに読み込ませて、x軸が最大12、y軸が最大150のグラフを描かせています。xypを使って描いたグラフは、文字を使ったグラフなので多少歪んで見えます。頭の中のイメージでグラフの傾向を読み取ってみてください。

情報xypは文字でグラフ表示するrpnの姉妹ソフトウェアです。xypの簡単な説明は姉妹ソフトウェアにありますので、興味のある方は参照ください。

季節ごとの黒点数を計算

 さて、データを1月から3月、4月から6月、7月から9月、10月から12月の3ヶ月ごとの期間に分けて合計と平均を出したいとします。こんなときにfoldが役に立ちます。まず、縦一列のデータを横一行のデータに変更します。

  >rpn 1 -c fold <data.txt
  111 127 102 109 127 106 112 93 99 86 95 83


次にfold'を使って3ヶ月ごとにデータを折り返します。先ほどのrpn式にfoldを繋げます。

  >rpn 1 -c fold <data.txt | rpn 3 -c fold'
  111 127 102
  109 127 106
  112 93 99
  86 95 83


これで、データは一行で3ヶ月ごとに区切られました。横方向に合計を計算したいので、3つのデータを足し合わせます。rpnの計算式を最後に繋げます。

  >rpn 1 -c fold <data.txt | rpn 3 -c fold' | rpn + +
  340
  342
  304
  264


3ヶ月ごとの合計値が計算できましたね。3で割ってあげると平均が計算されます。

  >rpn 1 -c fold <data.txt | rpn 3 -c fold' | rpn + + 3 /
  113.333
  114
  101.333
  88


3ヶ月平均でも微減傾向です。黒点数が偶然に少なくなっているというよりは、減少傾向にあると考えるのが妥当ですね。

広報ちなみに、これらの計算はカンタン分析パッケージを使うともっと楽に答えが出ます。

警告fold'は150個の数値、foldは1000個の数値程度を目安に使用してください。

情報本講座で使用したプログラムは、ユーティリティーパッケージとして購入することができます。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。

ユーティリティーパッケージ

ユーティリティー

マイスター

カレンダー

警告文字で作られた図表や式が崩れることがあります。ブラウザによっては固定幅フォントをMSゴシックにするときれいに表示されます。それでも崩れる場合は図表や式をメモ帳にコピー後、閲覧下さい。

警告rpn標準版(2kリビジョン)はダブルクォートで囲って下さい。

rpn 1 2 + ⇒ rpn "1 2 +"
rpn 1 -c foo ⇒ rpn "1" -c "foo"

ダブルクォートは省略できることが多いのですが、慣れない間は囲んだほうが無難です。なお、本ウェブサイトの記事ではrpn標準版(98リビジョン)を使用しているため囲っていません。詳しくは技術サポートの「rpn TIPS」を参照ください。

注意rpnの障害情報と対策はこちら