readr パッケージは、ファイルからデータを読み込んだり、データをファイルに書き出したり、文字列をパースしたりする際に利用する関数をまとめたパッケージである。ファイルを読み込んだり、文字列を操作したりするための関数は R にも標準実装されている。しかし、R の標準関数に比べて、readr の関数が処理速度が早く、直感的で使いやすい場合が多い。
ファイルの読み込み
readr パッケージでは、ファイルからデータを読み込むときに使用する関数として read_csv
や read_tsv
などが用意されている。これらの関数は R の標準関数である read.csv
や read.table
関数とほぼ同じ機能を持つが、次のような点で異なっている。
- readr パッケージの関数が R 標準関数に比べ、ファイルの読み込み速度が約 10 倍速い。
read_csv
やread_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 <- read_delim('data/rice.txt', delim = '\t'))
ファイル書き出し
ファイル書き出し用の関数には write_csv
、write_tsv
、write_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
- R for Data Science. O’Reilly. 2017, 100(8):4649-54. r4ds.had.co.nz