reshape2とtidyr

例えば、ggplot を使用して次の様な「男女別の人口推移」のグラフを作るものとします。

総務省の人口統計等からデータは入手できます。
ダウンロード後、Excelなどで次のように編集して、csv形式でとして保存するのが一般的な方法かと思います。

単純な表なので簡単に作れますが、面倒と思う人のため、次にデータを用意しておきました。

データの構成は、このように作るのが一般的と思いますが、これを上のような棒グラフでプロットするのは大変困難です。
x軸(年次)が共通で、y軸が各々男と女を別個にプロットすると重なり合ってしまうためです。回避手段(例えば、dodge を使うなど)は有るかもしれませんが、私の力量では無理です。
この問題の解決策は、データを次の通りに変更すること(が、一番手っ取り早い手段)です。

つまり、年次別に男と女の2行にしてにデータを持つことです。当然、数値が男女何れかを識別するために、変数名「男」、「女」をデータとする必要があります。(なお、この形式のデータフォーマットは、前者を wide-format、男女別に人口を持つ後者を long-format と言うのだそうです。)
力技でこのような変換もできますが、簡単に行うのがreshape2::melttidyr::gatherです。
変換方法は次の通り。
(1) reshape2::melt

(2) tidyr::gather

この2つは、全く同じことを行っていますが、tidyrの方がスピードが速いのでお勧めだそうです。

Rで行と行の計算を行う

Rで異なる行同士の演算ってどうしたものやら、全く分からない。
と言うことで、SQLite3を使おうとしたもの。(前のブログ参照)
データは、SQLite3と同じ次のテーブルを使います。

このsaleの年度間の増減を計算したい場合、
つまり、次の様な表を作成するにはどうするか?

R の場合も、「LAG」がこの問題を解くキーワードでした。
mutate内で、lag()を使用します。

実行結果は次の通り。

通常の言語では、何のこともないこのような計算が、Rではある程度の予備知識がなければ途方に暮れてしまう程、面倒なものですね。

SQLite3 で行と行の計算を行う

SQLで異なる行同士の演算って意外に難しいものですね。
例えば、次の様なテーブル(Sales)があったとします。

このsaleの年度間の増減を計算したい場合、
つまり、次の様な表を作成するにはどうするか?

「LAG」がこの問題を解くキーワードらしいが、残念ながら SQLite3 は未サポートの模様。
解決策のヒントは、stack overflowのここにありました。
これに基づいて(真似て)作ったクエリは次の通り。

SQLite3 CSVのインポート

CSVのインポートにはSQLiteStudioを使用します。
使用する前に、あらかじめデータベースを作成しておいてください。
今回は、test.sqlite3 という名称でDBを作成したものとします。
(1) データベースの確認

(2) CSVのインポート

●テーブル名入力

●CSVやエンコードの指定

(3) 確認
●フィールドの確認

●データの確認