Data Import Cheat Sheet

Rでのデータファイルの種類

R言語ではデータを格納する独自形式として、「.RDS」と「.RData」の2つがあり、

形式 格納オブジェクト 特徴
.RDS 1個のRオブジェクトを格納 再現性の高いコードを書くには推奨される。読み込み時にオブジェクト名を指定できる/しなくてはいけない
.RData 複数のRオブジェクトを格納 読み込みなどは楽だが、中身が何なのかわかりにくく、格納しているオブジェクトの名前を忘れると面倒。

という特徴がある。RStudioの本では「.RDS」の使用が推奨されている。「.RData」が自動で保存されないようにaliasやRStudioを設定しておく。

Rファイルとして保存することで、ファイルが自動で圧縮され、R関連のメタデータがオブジェクトとともに保存されることになる。特にデータがファクタ、日付・時刻情報、クラス属性などを持つ場合に有効。

base関数からreadr

saveRDSreadRDSの代わりにreadrの関数を使用する方針に。

readr::read_rds(path)
readr::write_rds(x, path, compress = c("none", "gz", "bz2", "xz"), ...)

「.RDS」ファイルの書き込み

書き込み(保存)はsaveRDSreadr::write_rds」を使用する。ディスクスペースの問題が以前より少ないため、デフォルトでは圧縮しないようになっている。 オブジェクト「x」を「data」フォルダ内の「x.rds」に保存したければ以下のように記載(混乱を避けるためにオブジェクト名とファイル名は一致させておく方が良さそう)

readr::write_rds(x, "data/x.rds")

「.RDS」ファイルの読み込み

読み込みはreadRDSreadr::read_rds」を使用する。

poker <- readr::read_rds("pocker.RDS")

オブジェクトをロードする時に名前をつけるため、たまたま同じ名前をつけていたRオブジェクトを上書きする心配もない。

readrによる読み込み

Excelファイルの処理

Read Excel Files • readxl

R言語でexcelファイルを読み込むためのパッケージ。tidyverseの一部のため原則としてこれを用いる。

readxl 1.0の解説 http://uribo.hatenablog.com/entry/2017/05/04/122524

Cell and Column Types • readxl

tidyverseをインストールしてあれば同時にインストールされている。

readxl::read_excel(path, sheet=1, col_names=TRUE, col_types=NULL, na='', skip=0)
  • read_excel()でxlsもxlsxも読み込める(拡張子で判断)
  • excel_sheets()でシート名を表示できる
  • read_excel()で読み込む時のシート指定はsheet引数で
    • sheet = “シート名”
    • sheet = シート番号
  • 読み込むセルの範囲を指定する方法は様々で、excel的な表現も可能
    • n_max = 3
      • ヘッダ行がある場合はそれを除いた行数で
    • range = “C1:E4”
    • range = cell_rows(1:4)
    • range = cell_cols(“B:D”)
    • range = “mtcars!B1:D5”
    • skipもある
  • 空白セルがとして扱われる。他を指定するならna = “文字列”
  • 列(変数)の名前とタイプはデフォルトでは自動的に決まる。col_namesとcol_typesで指定もできる
  • tibbleとして読み込まれる
  • JavaとかPerlのような外部ライブラリ不要
  • non-ASCIIはUTF-8にエンコードされる

タイプの自動推定がうまくいかない場合

手動での指定が可能。col_typesで指定できるのは"skip", "logical", "numeric", "date", "text", "list"になり、整数値などはここでは指定できない。読み込んだ後に適宜readr::parse_*系の関数でdplyr::mutate()していく感じになる。

Cell and Column Types • readxl

にもあるが、先にエクセルファイルの列名データだけ取り出し、適宜場合分け処理してcol_typesに読み込ませるタイプ指定用の文字列ベクトルを作っておくのが良さそう。

# エクセルファイルから列名を取得
nms <- readxl::read_excel(path = "対象エクセルファイル", skip = 0, n_max = 0) %>% 
  names()

# 文字列にしたい列用のベクトル設定
ct_chr <- c("ID", "Compli", "...")

# ファクターにしたい列用のベクトル設定
ct_factor <- c("ASAPS", "Sex", "...")

# 整数値にしたい列用のベクトル設定
ct_int <- c("Age", "EBL", "Urine", "...")

# 論理値にしたい列用のベクトル設定
ct_log <- c("...", "...")

# set column type
# あとでparseする都合上、文字列にしたい列、整数値にしたい列、ファクターにしたい列はいずれも"text"で指定
column_types <- dplyr::case_when(nms %in% ct_chr ~ "text",
                   nms %in% ct_int ~ "text",
                   nms %in% ct_factor ~ "text",
                   nms %in% ct_log ~ "logical",
                   TRUE ~ "numeric")

# 実際に読み込み
# suppressWarningsは下記自動推定に関するWarningを抑制するため
d <- suppressWarnings(readxl::read_excel(path = "対象エクセルファイル",
                            col_types = column_types, # 上記で設定した文字列ベクトルを指定
                            col_names = nms, # 必要ならこれも変えておける
                            skip = 1, # 列名指定したなら
                            n_max = 55)) %>% 
  # ファクターは結局orderedにしたかったりレベル指定が必要なら個別に設定することになる。
  dplyr::mutate(ASAPS = readr::parse_factor(ASAPS, levels = c("1", "2", "3", "4"), ordered = TRUE),
                Sex = readr::parse_factor(Sex, levels = c("M", "F"), ordered = TRUE),
                ) %>%
  # 整数値と論理値の列を処理
  # dplyr::mutate_at(ct_int, funs(readr::parse_integer(.))) %>% 
  # dplyr 0.8.0からfuns()は非推奨でpurrrと同じように~を利用する
  dplyr::mutate_at(ct_int, ~ readr::parse_integer(.)) %>% 
  dplyr::mutate_at(ct_logical, ~ readr::parse_logical(.))

どうしても時間型データだととりたがる

col_types"numeric"を指定していて、Excel上のセルタイプでも数値データなのに読み込み時にExpecting numeric in E9 / R9C5: got a dateのようなWarningsが大量発生することがある。自動判定だとdateタイプとされてしまう。指定さえしていれば実際にはnumericで読み込んでおり実害はないのだが、他のエラーが埋もれる勢いなので、suppressWarnings()で読み込み部分は囲ってしまうか、チャンクオプション(warning=FALSE)を変えるとするか良いかもしれない。以下のブログを見る限り放っておくしかなさそう。

readxl が numeric のセルを date だと判定してしまうやつ - 金魚亭日常

WindowsのExcelで読み込んだ時に文字化けしないcsvファイルの出力方法

readr::write_excel_csv()を使えば良いとのこと。通常はUTF-8で出力されるのにWindowsのExcelがSJISで読み込もうとするのが原因らしい。

Google Forms

データクレンジング実習