データの読み込みと保存

CSV ファイルの読み込みと保存

readr パッケージの活用

  • readr パッケージを使ってデータを読み込めば、 標準の read.csv() や read.table() などよりも高速省メモリ
    • 列名・データ型を指定しやすい
    • 空白行を自動で飛ばしてくれる
    • tibble (data.frameの改良版) で格納してくれる
  • UTF-8形式のファイルを読み込む場合 (海外 or 新しめの日本語データなど)

CSV ファイルの読み込みと保存

  • read_csv()write_csv()関数で行う
    • ドットではなくアンダーバー
    • 標準の read.csv() , write.csv() は非推奨
      • 実行時間が非常に長いから

UTF-8 形式での読み込み (デフォルト)

  • 予め library(tidyverse) を実行し、tidyverseパッケージを読み込んでおく
    • あるいは、readr::read_csv()のように関数にパッケージ名も併記する
dat <- read_csv("ファイル名.csv")

Shift-JIS (CP932) 形式での読み込み (特に日本語ファイル)

  • 上記の読み込みの結果、データフレームに文字化けが生じる場合、Shift-JIS形式で読み込むと解消されることがほとんど
    • 官公庁のデータは Shift-JIS 形式のことが多い
data <- read_csv("ファイル名.csv", locale = locale(encoding = "SJIS")) 

指定した数の行分を飛ばして読み込む

  • 関数の中に skip オプションを記すことで指定できる
# 上から2行分飛ばして読み込む
data <- read_csv("ファイル名", skip = 2) 

NA に置き換えたい値の指定

  • 関数の中に na オプションを記すことで指定できる
# 空欄、"NA"、"-"のいずれかであればNAの扱いに
data <- read_csv("ファイル名.csv", na = c("", "NA", "-"))

日本語が含まれる CSV ファイルの保存

  • 保存したファイルを Excel で編集したい場合、日本語が含まれているとExcelで文字化けしてしまう
  • write**_excel**_csv()関数で保存すれば解消できる
    • この関数は、データをBOM付きUTF-8 CSV形式で保存してくれるもの
    • BOMが付いていないと、Excelで日本語部分が文字化けしてしまう
data |> write_excel_csv("ファイル名.csv")

Excel ファイル (.xlsx, .xls) の読み込み

  • readxl パッケージで扱える
    • readxl パッケージは、tidyverse パッケージ をインストールすれば合わせてインストールされる
      • ただし、dplyrなどとは異なり、tidyverseパッケージの読み込みの際に合わせて読み込まれるパッケージではない
  • CSV ファイルよりは読み込み速度が劣る
    • 保存の際は Excel ファイルではなく、CSV など他の形式を用いる
      • openxlsx パッケージなどを使えば Excel 形式でも保存は可能。しかし、R では扱いづらいため、罫線や色が付いた表の作成を自動化したいなどの目的が無ければ推奨はしない
  • read_csv() と同様、naオプションやskipオプションが利用可能
data <- readxl::read_excel("ファイル名")
# 上から2行分飛ばして読み込む
data <- read_csv("ファイル名", skip = 2) 
# 空欄、"NA"、"-"のいずれかであればNAの扱いに
data <- read_csv("ファイル名.csv", na = c("", "NA", "-"))

読み込むシートの指定

  • sheet オプションで読み込むシートを指定できる

  • シートの番号(=数値。左から数える)を指定する場合

# 左から2番目のシートを読み込む
data <- readxl::read_excel("ファイル名", sheet = 2)
  • シートの名前(=文字列)を指定する場合
# 「ページA」という名前のシートを読み込む
data <- readxl::read_excel("ファイル名", sheet = "ページA")

データの型変換

  • 列のデータ型は読み込み時に自動で判別される
  • しかし、数値型や日付型の列を文字列型として読み込んでしまうことがある。その場合は、type_convert() を試してみる
data <- read_csv("data.csv") |> 
  type_convert() 
  • それでも無理なら、列のデータ型を手動で指定できる
# date列を文字列型に
data <- read_csv("data.csv",
  col_types = cols(date = col_character())) 
  • あるいは、as.character()as.numeric() などを用いた従来のやり方でも可能
    • その場合は、dplyrパッケージのmutate関数(=列の作成・上書き)を用いると良い
# date列を文字列型に
data <- read_csv("data.csv") |>
  dplyr::mutate(date = as.character(date))

SPSS データファイル (.sav) の読み込み

  • SPSS のデータファイルは、haven パッケージで扱える
    • SPSS データを R で扱うだけなら,SPSS 自体は不要
spss_data <- haven::read_sav("ファイル名") 

Shift-JIS 形式での SPSS データファイルの読み込み

  • encoding オプションで文字コードを指定できる
    • Shift-JIS形式なら”SJIS”と指定
spss_data <- haven::read_sav("ファイル名.sav", encoding = "SJIS") 

STATA データファイル (.dta) の読み込み

  • haven パッケージで扱える
    • STATA データを R で扱うだけなら,STATA 自体は不要
stata_data <- haven::read_dta("ファイル名") 

Apache Arrow ファイルの読み込みと保存

  • 巨大なデータを保存する場合は、arrow パッケージの write_parquet() 関数で行うことがおすすめ
    • メリット
      • CSVなどの他形式のファイル よりも読み込みが高速
      • CSVなどの他形式のファイルよりもサイズを圧縮できる
      • R だけでなく、Python など他の言語でも扱える (rds や RData だとそうはいかない)
  • parquet ファイルの読み込みは、arrow パッケージの read_parquet() 関数で行う

parquet 形式のファイルの読み込み

data <- arrow::read_parquet("ファイル名.parquet")

parquet 形式でのファイルの保存

data |>
  arrow::write_parquet("ファイル名.parquet")

データの読み込み時間の比較

  • パッケージごとに、“CSES Integrated Module Dataset” (423.9 MB) のデータの読み込みに費やした時間を比較した
    • 1回実行した結果の値をそのまま記載しているので、多少の誤差が生じているはずである
パッケージ名::関数名 読み込み時間
read.csv() 28.64s
readr::read_csv() 3.98s
arrow::read_csv_arrow() 3.42s
data.table::fread() 1.06s
readRDS() 0.8s
readr::read_rds() 0.8s
arrow::read_parquet() 0.31s
fst::read_fst() 0.19s
arrow::read_feather() 0.11s
  • CSV よりも parquetfeather といった Apache Arrow のファイルフォーマットのほうが高速に読み込めることが分かる
  • fst や rds は R でしか読み込めない形式なので、積極的な使用は推奨できない
    • rds を使うなら、parquet や feather を使ったほうが良い
      • parquet や feather なら、Python などの他の言語でも読み込み・書き込みできる

【参考】データの書き込み時間の比較

  • パッケージごとに、“CSES Integrated Module Dataset” (423.9 MB) のデータを読み込んだうえで、それを別ファイルに書き込む際に費やした時間を比較した
    • 1回実行した結果の値をそのまま記載しているので、多少の誤差が生じているはずである
パッケージ名::関数名 読み込み時間 生成されたファイルのサイズ
write.csv() 89.07s 421.9 MB
saveRDS() 5.19s 11.3 MB
arrow::write_csv_arrow() 2.82s 420.4 MB
readr::write_csv() 2s 415.9 MB
readr::write_rds() 1.88s 536.2 MB
arrow::write_parquet() 1s 10.7 MB
data.table::fwrite() 0.45s 415.9 MB
arrow::write_feather() 0.25s 33.7 MB
fst::write_fst() 0.21s 32.3 MB
  • 標準の write.csv() はあまりにも時間がかかるので非推奨
  • parquet 形式で保存すれば、ファイルサイズを元データの約 40 分の 1 にまで圧縮できる
    • 標準の saveRDS() も parquet と同程度の圧縮を行えることが分かる
      • readr の save_rds() は、標準の関数よりも高速だが、ファイルサイズが元データより大きくなってしまうため非推奨
  • fst や rds は R でしか読み込めない形式なので、積極的な使用は推奨できない