1 RStudioのProject管理とさまざまなデータ形式の読み込み方法
Rを利用し,レポートを作成するとき,データ,スクリプト,グラフなどが増えて行きます.そうしたデータ等が増えていくと,ファイルを整理し,まとめていくのが大変になって行きます.RStudioにはデータ管理はもちろんのことプロジェクト全体を管理するのに便利なProjectと呼ばれる機能が用意されています.そこで最初に,データを扱う上で有益なRStudioのProject機能を紹介します.
その上で,さまざまな形式のデータの読み込み方法を解説します.上述のように,Rはほぼすべてのデータ形式を読み込むことができます.以下で紹介するデータベースの提供するデータ形式はほとんどがcsv形式ですが,パネルデータの扱い易さからStata形式,あるいはもっとも一般的なExcel形式で提供されている場合もあります.そこでここではさまざまなデータ形式をRに読み込む方法を紹介します.
1.1 RStudioのProjectの利用
Project機能を利用すると,プロジェクトごとに,作業ディレクトリの場所,実行の履歴やオブジェクト(変数や関数),スクリプトなどが記憶されます.作業の再開時に,プロジェクトを開くとすぐにプロジェクトごとの以前の環境が利用でき便利です. それではRStudioでProjectを作成してみましょう.Projectの作成は,図のように,メニューから,File > New Project…をクリックします.

すると,以下のようなダイアログが現れます.既存のディレクトリを利用する場合はExisting Directoryを選択しますが,ここで新しいディレクトリを作成しますので,New Directoryを選択します

最後に,新しいプロジェクトNew Projectのためのディレクトリ名を尋ねるダイアログが開きます.


[Directory name]の空欄のボックスに,新規プロジェクトを作成するディレクトリ名を入力します.ここではとりあえずProject_1という名前にしておきます.[Browse…]ボタンをクリックして,プロジェクトを置きたいディレクトリの場所を指定します.すると,新たに作ったプロジェクト用のディレクトリの下に,ディレクトリと同じ名前のプロジェクトができます.この例では“~/Project_1/”下に“Project_1.Rproj”ができます.次回の作業からは,RStudioのメニューからFile > Open Project…または,直接,ディレクトリを開いて,プロジェクト[Project_1.Rproj]をダブルクリックすれば,Project_1の環境が再現されます.
ちなみに,Project_1.Rprojをクリックし,RStuidoを起動させた後,コンソール画面にgetwd() ―get working directory(現在の作業ディレクトリを取得する)を意味します―と入力し,現在の作業ディレクトリを確認してみてください.“~/Project_1/”と表示されるはずです.
getwd() #現在の作業ディレクトリの場所を確認
1.2 多様なデータ形式の読み込み方法
データを読み込む方法としては大きくは2つあります.1つは関数を利用する方法,もう1つはRStudioの[Import Dataset]プルダウンメニューを利用する方法です.
1.2.1 Import Datasetを利用する
最初に,後者のRStudioの[Import Dataset]を使ってデータを読み込むとしましょう.Environmentタブのところにあるimport Datasetをクリックしてみてください.以下の図のようなメニューが開きます.

この図から理解されるように,RStudioのimport Datasetを使えば,csvフィアルは言うまでもなく,主なファイル形式―エクセルファイル,SPSSファイル,SASファイル,Stataファイル―を読み込むことができます. たとえば,今持っているファイルがStata形式だとしましょう.そのときはこのメニューから[From Stata…]を選択するだけです.[Browse]ボタンを押し,Stataファイルを選択すると,以下の図のようにデータが読み込まれます.右下の[import]をクリックすると,ファイルがRStudioに読み込まれ,View()関数によってViewウィンドウが開きます.この例ではTSDv4.dtaというstata形式のファイルをデスクトップに置ています.

csv形式のフィルを読み込む場合は,上の図において[From Text(readr)…]を選択し,ディレクトリ内のcsvファイルを指定するだけです.その結果,この図と同じウィンドウが開きます.あとは同じく右下の[Import]をクリックするだけです.
以上がRStudioのメニュー[Import Dataset]を利用したデータの読み込み方法ですが,再現性の観点からはこれはお奨めできません.データの読み込み手順も,スクリプトに書き込んだ方が良いでしょう.実は上の図のウィンドウの右下にStataファイルを読み込むためのスクリプトが自動的に生成されます.
# Stataファイルの読み込み
library(haven)
<- read_dta("~/Desktop/TSDv4.dta")
TSDv4 View(TSDv4)
関数を利用したデータの読み込みのさいには,これをコピーし,スクリプトに記載すれば,作業が再現可能となります.
1.2.2 関数を利用する
それでは次に関数を利用したデータの読み込み方法を紹介しましょう.
1.2.2.1 csvファイルの読み込み - read_csv()
csv(comma-separated values)ファイルとはカンマ区切りで値が並べられているプレーンテキストファイルです.csv形式のファイルを読み込むためにはさまざまな関数がありますが,readrの中のread_csv()関数を利用します.readrはtidyverseがインストールされていれば,利用可能です.そこで最初にパッケージtidyverseをインストールし,library()で呼び出し,利用可能にしておきます.
# tidyverseのインストール
install.packages("tidyverse")
# tidyverseの呼び出し
library(tidyverse)
これでreadrも利用可能となります.それではreadrのread_csv()関数を使ってcsvファイルを読み込むとしましょう.read_csvのもっともシンプルなコードは次のようになります.
read_csv("csvファイル名")
練習用ファイルとして西山慶彦他著『計量経済学』のウェブサポートで提供されているcsvファイルを利用します.サポートサイトから第4章のch04_wage.csvファイルをダウンロードし,作業ディレクトリProject_1の下に保存してください.
それでは練習として作業ディレクトリProject_1の下に保存したch04_wage.csvファイルを読み込み,それをwageというオブジェクトに容れてみましょう.
<- read_csv("ch04_wage.csv") wage
スクリプトに上のように入力し,スクリプト・ウィンドウの[Run]をクリックしてみてください.RStudioの右上のEnvironmentウィンドウをみると,[Data]の下に21の観察値,3変数からなるwageデータセットが出来上がったことが分かります.head(wage), str(wage)でデータ構造を確認してみてください.また小さなデータセットですからView(wage)で確認してみても良いでしょう.次に,read_csv()関数がとるいくつかの有益な引数を紹介しておきます.
- 変数(列)タイプの指定:col_types = NULL これはNULLの場合(もしくはこの引数が省略された場合),すべての変数(列)のタイプが最初の1000行にもとづき指定されます.

read_csv(“ch04_wage.csv”)を実行したさいに,図のような結果がコンソール画面に表示されます.たとえば,year = col_double()は変数列yearが倍精度浮動小数点数の数値タイプであることを示しています. この表示は列が期待通りの変数タイプで読み込まれたどうかをチェックするのに有益です.
「年」を表現するyear変数の型に倍精度浮動小数点数を利用することは計算資源の無駄遣いかもしれません.資源節約のため「整数」に変更するとしましょう.つまり変数yearを整数integerとして読み込むことにします.この場合,col_types=を利用します.上の図の結果をそのままコピーし,yearの部分だけをyear = col_integerに変更し,read_csv()関数の引数col_typesに次のように指定します.
<- read_csv("ch04_wage",col_types =
wage cols(
year = col_integer(), # year変数の型を「整数」に変更
productivity = col_double(),
wage = col_double()
)
str(wage)で変数の型を確認すると,変数yearがyear = col_integer()と整数に変わっていることが分かります.
列名の指定:col_names = TRUE col_names = TRUEの場合,読み込むデータセットの最初の行が列名として利用され,その行はデータフレームには含まれません.他方,col_names = FALSEの場合,列の名前は,たとえばX1,X2,X3のように自動的に生成されます.また,col_names =c(“country”,”wage”,”GDP”)のように文字列のベクトルからなる場合,それが列名として利用されます.
欠損値の扱い:na= “NA” これによって欠損値と解釈すべき文字列を指定します.Rでは欠損値は”NA”で表示されますので,na = “NA”と指定することができます.また”NA”に加えて”.”でも欠損値が表示されているような場合,na= c(“.”,”NA”)と指定します.
最後に,データフレームをcsvファイルとして保存する方法を紹介しておきましょう.保存のためにはwrite_csv()関数を利用します.
write_csv(データフレーム名, file = "保存データの名前.csv", append=FALSE,col_names=FALSE)
以上のcsvファイルの読み込み・保存手順までをスクリプトにまとめて書くと次のようになります.
library(tidyverse)
<- read_csv(“ch04_wage.csv”)
wage
str(wage) # str() データ構造を表示する関数
head(wage) # head() データフレームの冒頭を表示する関数
View(wage) # View() データフレームを表示する関数
<- read_csv(“ch04_wage”,col_names = TRUE,col_types =
wage cols(
year = col_integer(),
productivity = col_double(),
wage = col_double()
)
# データフレームwageをcsv形式で保存
write_csv(wage, “wage.csv”, append = FALSE, col_names = FALSE)
1.2.2.2 Excelファイルの読み込み - read_excel()
エクセルファイル,つまり拡張子が.xls, xlsxのファイルを読み込むにはreadxlパッケージが必要となります.これもパッケージtidyverse に含まれていますのでtidyverseが組み込まれているのであれば,改めてインストールする必要はありません.
.xls, xlsxのファイルを読み込むためには,readxlの中のread_excel()関数を利用します.ここでもサンプルファイルとして『計量経済学』提供の練習ファイルを利用します.第4章のdata for chap 4 exercise 10.xlsxファイルをダウンロードし,作業ディレクトリProject_1の下に保存してください.このエクセルファイルをファイルを読み込み,それをsampleというオブジェクトに容れます.
library(readxl) # readxlの呼び出し
<- read_excel("data for chap 4 exercise 2.xlsx") sample
このスクリプトを実行すると,Excel形式のファイルが読み込まれます.View(sample)でデータ内容を表示させると,5変数の47観察値が確認されます.
これはもっともシンプルな用法です.read_excel()もread_csvと同様の引数を取りますが,いくつか違いがあります.もっとも大きな違いはエクセルファイルが複数のワークシートを持つ点にあります.このサンプルのエクセルファイルは1つのワークシートだけからなるファイルですが,エクセルファイルには複数のワークシートからなるものもあります.これを扱うためにread_excel()の引数sheet=シート番号によって特定のワークシートを指定できます.たとえば,次のように指定します.
<- read_excel("data for chap 4 exercise 2.xlsx",sheet=1) sample
1.2.2.3 Stata,SAS,SPSSファイルの読み込み - read_dta()
SPSS,SAS,およびStataのファイルを読み込むためには,havenパッケージが必要です.事前にインストールしておく必要がありますが,これもパッケージtidyverseがインストールされていれば,havenもインストールされています.SPSS,SAS,およびStataのファイルを読み込むために,最初にhavenを呼び出します.
library(haven)
Stataファイルを読み込むにはread_dta(),SASファイルの読み込みはread_sas(), SPSSファイルを読み込むにはread_spss()を使います.たとえば,拡張子.savもしくは.zsavを持つSPSSファイルを読むとしましょう.かりにsample.savというファイルを持っていたとします.これをRで読み込み,sampleというオブジェクトに容れることを想定しましょう.次のように入力するだけです.
# spssファイルの読み込み
<- read_spss("sample.sav") sample
read_dta(),read_sas()についても同じです.
1.3 tidyverse4
次の章から具体的にR,Rパッケージを利用したデータの取得方法を説明しますが、そのさい、頻繁に利用するtidyverseについてここで簡単に触れておきます.具体的な利用法は、じっさいにデータをダウンロードしたりデータ処理を行うさいに説明します.ここではtidyverseの中に収められている次の3つの基本的な関数の利用法を説明します.
- 特定の行を抽出する - filter()
- 特定の列を抽出する - select()
- 処理をつなげる - パイプ演算子 %>%
最初に、tidyverseをインストールしておきます.
install.packages("tidyverse") # tidyverseのインストール
library(tidyverse) # tidyverseの呼び出し
1.3.1 特定の行を抽出する - filter()関数
以下ではtidyverseに用意されているデータフレームpopulationを使って説明していきます.このデータフレームの中には各国の人口の推移が収められています.以下のstr(population)
の表示tibble [4,060 × 3]
から理解されるように,このデータセットは4,060行と3列から構成されます.列は変数名で、country, year, populationの3変数から成ります.
str(population)
## tibble [4,060 × 3] (S3: tbl_df/tbl/data.frame)
## $ country : chr [1:4060] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
## $ year : int [1:4060] 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 ...
## $ population: int [1:4060] 17586073 18415307 19021226 19496836 19987071 20595360 21347782 22202806 23116142 24018682 ...
head()関数やView()関数を使った表示の方がデータセットのイメージがつかみやすいかもしれません.
head(population)
## # A tibble: 6 × 3
## country year population
## <chr> <int> <int>
## 1 Afghanistan 1995 17586073
## 2 Afghanistan 1996 18415307
## 3 Afghanistan 1997 19021226
## 4 Afghanistan 1998 19496836
## 5 Afghanistan 1999 19987071
## 6 Afghanistan 2000 20595360
このhead()関数はデータフレームの最初の6行しか表示しませんが、日本のデータも含まれています.変数countryがJapan
という値をとる行になります.それではfilter()関数を利用し、日本だけを取り出してみましょう.
filter()関数の使い方は次のようになります.
filter(データフレーム名,抽出条件)
この例ではデータフレームの名前はpopulationになります.抽出条件は、変数countryの行の値がJapanに一致するもの、となります.これはcountry == “Japan”と入力します.ここでは抽出条件の真偽が問題となりますので論理計算の等号= =
が利用されています.またcountry変数は文字列ですので” “
で囲む必要があります.これを実行すると日本のデータだけが抽出されます.
filter(population,country == "Japan")
## # A tibble: 19 × 3
## country year population
## <chr> <int> <int>
## 1 Japan 1995 124483305
## 2 Japan 1996 124794906
## 3 Japan 1997 125048712
## 4 Japan 1998 125266855
## 5 Japan 1999 125481436
## 6 Japan 2000 125714674
## 7 Japan 2001 125973930
## 8 Japan 2002 126249090
## 9 Japan 2003 126523597
## 10 Japan 2004 126772899
## 11 Japan 2005 126978754
## 12 Japan 2006 127136020
## 13 Japan 2007 127248855
## 14 Japan 2008 127319434
## 15 Japan 2009 127352872
## 16 Japan 2010 127352833
## 17 Japan 2011 127319206
## 18 Japan 2012 127249704
## 19 Japan 2013 127143577
1.3.2 特定の列を抽出する - select()関数
つぎに特定の列、言いかえれば変数を抽出してみます. このためにはselect()関数を利用します.
select(データフレーム名, 抽出する変数名)
たとえば、データセットpopulationから変数yearと変数populationを取り出してみます.このためにはselect()関数に次のように入力するだけです.
select(population,year,population)
## # A tibble: 4,060 × 2
## year population
## <int> <int>
## 1 1995 17586073
## 2 1996 18415307
## 3 1997 19021226
## 4 1998 19496836
## 5 1999 19987071
## 6 2000 20595360
## 7 2001 21347782
## 8 2002 22202806
## 9 2003 23116142
## 10 2004 24018682
## # … with 4,050 more rows
これを実行すると、このように–意味のないデータセットですが–yearとpopulationから形成されるデータが抜き出されます.
1.3.3 処理をつなげる - パイプ演算子 %>%
データフレームpopulationを使った次のような一連のデータ処理を考えてみます.
- country変数のうち
Japan
だけの行を取り出す. - さらにその結果から変数yearと変数populationを取り出す.
1の処理はデータフレームpopulationに対してfilter()関数を適用することを意味します. 言いかえると、データフレームpopulationをfilter()関数に渡す、ということになります.これをパイプ(%)というものを使うと次のように表現できます.
%>%
population filter (country == "Japan")
ここでは処理が%>%
で結合されていますので、filter()
関数の中にデータフレーム名を入力する必要がなくなります.
2の処理はこの結果をselect()関数に渡すことになります. これもパイプ(%)を使って入力してみましょう.
%>%
population filter (country == "Japan") %>%
select(year, population)
## # A tibble: 19 × 2
## year population
## <int> <int>
## 1 1995 124483305
## 2 1996 124794906
## 3 1997 125048712
## 4 1998 125266855
## 5 1999 125481436
## 6 2000 125714674
## 7 2001 125973930
## 8 2002 126249090
## 9 2003 126523597
## 10 2004 126772899
## 11 2005 126978754
## 12 2006 127136020
## 13 2007 127248855
## 14 2008 127319434
## 15 2009 127352872
## 16 2010 127352833
## 17 2011 127319206
## 18 2012 127249704
## 19 2013 127143577
このスクリプトの%>%はパイプと呼ばれ,操作を連結するものです.日本語で言えば「そして」ということになるでしょうか5.
tidyverseの用法についてはすでに紹介したHadley Wickham『Rではじめるデータサイエンス』(Web翻訳版)、松村優哉他『改訂2版 RユーザのためのRStudio[実践]入門〜tidyverseによるモダンな分析フローの世界』を参照してください.↩︎
パイプ演算子のとても分かり安いイメージが宋財泫 (Jaehyun Song)・矢内勇生 (Yuki Yanai)氏の「私たちのR: ベストプラクティスの探究」において与えられています.またこのBookdownはとても優れたRプログラミング入門書です.↩︎