readr パッケージによるデータの読み込みと書き出し、文字列パース

readr

readr パッケージは、ファイルからデータを読み込んだり、データをファイルに書き出したり、文字列をパースしたりする際に利用する関数をまとめたパッケージである。これらの関数は R に標準実装されているが、readr の関数を使用した方が、R の標準関数に比べて速度が速く、効率的な処理を行える。

ファイルの読み込み

readr パッケージでは、ファイルからデータを読み込むときに使用する関数として read_csvread_tsv などが用意されている。これらの関数は R の標準関数である read.csvread.table 関数とほぼ同じ機能を持つが、次のような点で異なっている。

  • readr パッケージの関数が R 標準関数に比べ、ファイルの読み込み速度が約 10 倍速い。
  • read_csvread_tsv 関数にはお節介な機能がない。
    • 文字列データを勝手に因子型に変換しない。
    • 列名を勝手に(X.1、X.2、X.3 などのように)変換しない。
  • 読み込まれたデータは tibble 型のオブジェクとして保存される。(R 標準関数ではデータフレーム型のオブジェクトとして保存される。)

CSV ファイルの読み込み

d <- read_csv('data/rice.csv')

TSV ファイルの読み込み

d <- read_tsv('data/rice.tsv')

任意の区切りのファイルの読み込み

区切り文字を指定して、ファイルからデータを読み込むときに read_delim 関数を使用する。このとき、区切り文字を delim オプションで指定する。

d <- ead_delim('data/rice.txt', delim = '\t'))

ファイル書き出し

ファイル書き出し用の関数には write_csvwrite_tsvwrite_delim などの関数が用意されている。これら関数を使用して、データをファイルに保存する際に、文字コードが UTF-8 として保存される。使い方は R の標準関数とほぼ同じように使う。

write_csv(d, 'data/results.csv')
write_tsv(d, 'data/results.csv')
write_tsv(d, 'data/results.csv', delim = ';')

文字列パース

readr パッケージには文字列をパースするための関数が用意されている。

関数機能
parse_logical文字列を理論型(`TRUE` または `FALSE`)に変換する。
parse_integer文字列を整数型に変換する。
parse_double文字列を小数型に変換する。
parse_character文字列を文字型に変換する。UTF-8 以外の文字列コードから UTF-8 に変換するときに使用する。
parse_datetime文字列を datetime 型に変換する。
parse_date文字列を date 型に変換する。
parse_time文字列を time 型に変換する。
parse_number文字列中に含まれている数字を整数に変換する。
x <- c('TRUE', 'FALSE')
y <- parse_logical(x)
print(y)
## [1]  TRUE FALSE


x <- c('64')
y <- parse_integer(x)
print(y)
## [1] 64


x <- c('3.14')
y <- parse_integer(x)
## Warning: 1 parsing failure.
## row col               expected actual
##   1  -- no trailing characters    .14
print(y)
## [1] NA
## attr(,"problems")
## # A tibble: 1 x 4
##     row   col expected               actual
##                        
## 1     1    NA no trailing characters .14


x <- c('3.14')
y <- parse_double(x)
print(y)
## [1] 3.14


x <- "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd"
y <- parse_character(x, locale = locale(encoding = "Shift-JIS"))
print(y)
## [1] "こんにちは"


x <- "2019-10-20 10:00:00"
y <- parse_datetime(x)
print(y)
## [1] "2019-10-20 10:00:00 UTC"


x <- "2019-10-20"
y <- parse_date(x)
print(y)
## [1] "2019-10-20"


x <- "23:00:00"
y <- parse_time(x)
print(y)
## 23:00:00


x <- "11:00:00 pm"
y <- parse_time(x)
print(y)
## 23:00:00


print(parse_number("123,456,789"))  # US, JP, ...
## [1] 123456789


print(parse_number("123.456.789", locale = locale(grouping_mark = "."))) # EU
## [1] 123456789


print(parse_number("123'456'789", locale = locale(grouping_mark = "'"))) # CH
## [1] 123456789

References

  • Grolemund G, Wickham H. R for Data Science. O’Reilly. 2017, 100(8):4649-54. r4ds.had.co.nz