Emacs org-modeを使ってみる: (4) 表計算

このエントリーをはてなブックマークに追加

今回は表計算について,使い方をまとめてみる.
なおUbuntu 8.04 LTSとEmacs22上で, org-6.34c (2010年1月10日リリース)の利用を前提にしている.

合計の計算

合計を計算するには,合計したい領域をリージョンとして選択する(transient-mark-mode).
たとえば,「200」の「2」の場所で「C-SPC C-SPC」をタイプする.「 」はカーソル位置を示す.

  |--------+-------|
  | バス   |   200 |
  | 電車   |   160 |
  | 新幹線 | 15000 |

「15000」の右側にカーソルを移動し,「C-c +」をタイプすると合計の「15360」がキルリングに保存されるので,「C-y」で貼り付けることができる.

ソート

「C-c ^」で,行をソートできる.
たとえば,以下で2列目にカーソルを移動する.

  |--------+-------|
  | バス   |   200 |
  | 電車   |   160 |
  | 新幹線 | 15000 |

「C-c ^」をタイプし,「n」をタイプすると数値の昇順にソートされる.「n」の代わりに「N」をタイプすれば数値の降順になる.

  |--------+-------|
  | 電車   |   160 |
  | バス   |   200 |
  | 新幹線 | 15000 |

数式の入力

以下では,次の表を例に用いる(値は適当です).

  |----------+----+----+----+----+------|
  |          | Q1 | Q2 | Q3 | Q4 | 合計 |
  |----------+----+----+----+----+------|
  | パソコン | 30 |  0 | 50 |  0 |      |
  | ソフト   |  5 | 15 | 20 |  3 |      |
  | 通信     |  2 |  2 |  2 |  2 |      |
  |----------+----+----+----+----+------|
  | 合計     |    |    |    |    |      |
  |----------+----+----+----+----+------|

ここで,「C-c }」をタイプすると行と列の名前が表示される.再度「C-c }」をタイプすると表示が消える.

I*1   |A---------+B---+C---+D---+E---+F-----|
   1  |          | Q1 | Q2 | Q3 | Q4 | 合計 |
I*2   |A---------+B---+C---+D---+E---+F-----|
   2  | パソコン | 30 |  0 | 50 |  0 |      |
   3  | ソフト   |  5 | 15 | 20 |  3 |      |
   4  | 通信     |  2 |  2 |  2 |  2 |      |
I*3   |A---------+B---+C---+D---+E---+F-----|
   5  | 合計     |    |    |    |    |      |
I*4   |A---------+B---+C---+D---+E---+F-----|
行の合計

F2の欄,すなわち「パソコン」の行の右端の欄にカーソルを移動する.

  |----------+----+----+----+----+------|
  |          | Q1 | Q2 | Q3 | Q4 | 合計 |
  |----------+----+----+----+----+------|
  | パソコン | 30 |  0 | 50 |  0 |      |
  | ソフト   |  5 | 15 | 20 |  3 |      |
  | 通信     |  2 |  2 |  2 |  2 |      |
  |----------+----+----+----+----+------|
  | 合計     |    |    |    |    |      |
  |----------+----+----+----+----+------|

「C-c =」をタイプすると「Column formula F&=」とメッセージが表示されるので,「vsum(B&..E&)」と入力する.すると,同一行の2列目(B)から5列目(E)の合計値である80が6列目(F)に表示され,表の下部に式「$6=vsum($2..$5)」が表示される.

  |----------+----+----+----+----+------|
  |          | Q1 | Q2 | Q3 | Q4 | 合計 |
  |----------+----+----+----+----+------|
  | パソコン | 30 |  0 | 50 |  0 |   80 |
  | ソフト   |  5 | 15 | 20 |  3 |      |
  | 通信     |  2 |  2 |  2 |  2 |      |
  |----------+----+----+----+----+------|
  | 合計     |    |    |    |    |      |
  |----------+----+----+----+----+------|
#+TBLFM: $6=vsum($2..$5)

式「$6=vsum($2..$5)」は, 6列目の値が2列目から5列目の合計であることを表している.
「TBLFM」の行にカーソルを移動し「C-c C-c」をタイプすると,すべての行に対してこの計算式が適用される.素晴らしい!

  |----------+----+----+----+----+------|
  |          | Q1 | Q2 | Q3 | Q4 | 合計 |
  |----------+----+----+----+----+------|
  | パソコン | 30 |  0 | 50 |  0 |   80 |
  | ソフト   |  5 | 15 | 20 |  3 |   43 |
  | 通信     |  2 |  2 |  2 |  2 |    8 |
  |----------+----+----+----+----+------|
  | 合計     |    |    |    |    |    0 |
  |----------+----+----+----+----+------|
#+TBLFM: $6=vsum($2..$5)

なお2行目だけに適用したい場合は,式を「@2$6=vsum(@2$2..@2$5)」と編集すれば良い.
ここで用いた「vsum」は,合計を求めるEmacs Calcの関数である.「vmean」を用いれば平均値となる.以下に他の関数の一部を示す.

関数
vcount(範囲) データの個数
vsum(範囲) データの総和
vprod(範囲) データの総積
vmax(範囲) データの最大値
vmin(範囲) データの最小値
vmean(範囲) データの(算術)平均
vgmean(範囲) データの幾何平均
vhmean(範囲) データの調和平均
vsdev(範囲) データの標準偏差(N-1)
vpsdev(範囲) データの標準偏差(N)
vvar(範囲) データの分散
vmedian(範囲) データのメジアン(中央値)

その他,対数関数,三角関数など多数の関数が利用できる.

列の合計

今度は列の合計である. B5の欄にカーソルを移動する.

  |----------+----+----+----+----+------|
  |          | Q1 | Q2 | Q3 | Q4 | 合計 |
  |----------+----+----+----+----+------|
  | パソコン | 30 |  0 | 50 |  0 |   80 |
  | ソフト   |  5 | 15 | 20 |  3 |   43 |
  | 通信     |  2 |  2 |  2 |  2 |    8 |
  |----------+----+----+----+----+------|
  | 合計     |    |    |    |    |    0 |
  |----------+----+----+----+----+------|
#+TBLFM: $6=vsum($2..$5)

「C-u C-c =」とタイプすると「Field formula B5=」とメッセージが表示されるので,「vsum(@2..@4)」と入力する.すると, B列の2行目(B2)から4行目(B4)の合計値である37が5行目(B5)に表示され,表の下部に式「@5$2=vsum(@2..@4)」が追加される.
「TBLFM」の行にカーソルを移動し「C-c C-c」をタイプすると,再計算される(何度か再計算する必要があるかも知れない).

  |----------+----+----+----+----+------|
  |          | Q1 | Q2 | Q3 | Q4 | 合計 |
  |----------+----+----+----+----+------|
  | パソコン | 30 |  0 | 50 |  0 |   80 |
  | ソフト   |  5 | 15 | 20 |  3 |   43 |
  | 通信     |  2 |  2 |  2 |  2 |    8 |
  |----------+----+----+----+----+------|
  | 合計     | 37 |    |    |    |   37 |
  |----------+----+----+----+----+------|
#+TBLFM: $6=vsum($2..$5)::@5$2=vsum(@2..@4)

同様に操作を続けると以下のようになる.

  |----------+----+----+----+----+------|
  |          | Q1 | Q2 | Q3 | Q4 | 合計 |
  |----------+----+----+----+----+------|
  | パソコン | 30 |  0 | 50 |  0 |   80 |
  | ソフト   |  5 | 15 | 20 |  3 |   43 |
  | 通信     |  2 |  2 |  2 |  2 |    8 |
  |----------+----+----+----+----+------|
  | 合計     | 37 | 17 | 72 |  5 |  131 |
  |----------+----+----+----+----+------|
#+TBLFM: $6=vsum($2..$5)::@5$2=vsum(@2..@4)::@5$3=vsum(@2..@4)::@5$4=vsum(@2..@4)::@5$5=vsum(@2..@4)

主なキーバインドのまとめ

キー 処理
C-c + リージョン内の数値の合計を計算
C-c ^ 行のソート
C-c } 行名,列名の表示/非表示
C-c = 行に対する計算式を入力
C-u C-c = 列に対する計算式を入力
C-c C-c 再計算