例えば、ggplot を使用して次の様な「男女別の人口推移」のグラフを作るものとします。
総務省の人口統計等からデータは入手できます。
ダウンロード後、Excelなどで次のように編集して、csv形式でとして保存するのが一般的な方法かと思います。
1 2 3 4 5 6 7 8 9 |
年次 男 女 1 大正9年 28044 27919 2 大正14年 30013 29724 3 昭和5年 32390 32060 4 昭和10年 34734 34520 5 昭和15年 35387 36546 6 昭和25年 41241 42873 7 昭和30年 44243 45834 8 昭和35年 46300 48001 |
単純な表なので簡単に作れますが、面倒と思う人のため、次にデータを用意しておきました。
人口推移 0.59 KB
データの構成は、このように作るのが一般的と思いますが、これを上のような棒グラフでプロットするのは大変困難です。
x軸(年次)が共通で、y軸が各々男と女を別個にプロットすると重なり合ってしまうためです。回避手段(例えば、dodge を使うなど)は有るかもしれませんが、私の力量では無理です。
この問題の解決策は、データを次の通りに変更すること(が、一番手っ取り早い手段)です。
1 2 3 4 5 6 7 |
年次 性別 人口 1 大正9年 男 28044 2 大正9年 女 27919 3 大正14年 男 30013 4 大正14年 女 29724 5 昭和5年 男 32390 6 昭和5年 女 32060 |
つまり、年次別に男と女の2行にしてにデータを持つことです。当然、数値が男女何れかを識別するために、変数名「男」、「女」をデータとする必要があります。(なお、この形式のデータフォーマットは、前者を wide-format、男女別に人口を持つ後者を long-format と言うのだそうです。)
力技でこのような変換もできますが、簡単に行うのがreshape2::meltとtidyr::gatherです。
変換方法は次の通り。
(1) reshape2::melt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
library(reshape2) # データ入力 popu <- read.csv("populaton.csv",fileEncoding = "UTF-8",stringsAsFactors = FALSE) #*************************************************************** # データフレームの構成を変更する wide-format -> long-format へ #*************************************************************** popu2 <- reshape2::melt(popu,id=c("年次"),variable.name = "性別",value.name = "人口") # 年次別にソート popu2 %>% arrange(年次) |
(2) tidyr::gather
1 2 3 4 5 6 7 8 9 10 11 12 13 |
library(tidyverse) # データ入力 popu <- read.csv("population.csv",fileEncoding = "UTF-8",stringsAsFactors = FALSE) #*************************************************************** # データフレームの構成を変更する wide-format -> long-format へ #*************************************************************** popu1 <- popu %>% tidyr::gather(key = 性別,value = 人口,男,女) %>% arrange(年次) # 年次別にソート |
この2つは、全く同じことを行っていますが、tidyrの方がスピードが速いのでお勧めだそうです。