読者です 読者をやめる 読者になる 読者になる

readr 0.0.0.9000を使ってみる

Hadleyさん作のCSVとかTSVとかを読むためのパッケージ。バージョンを見ると分かるように(羽鳥教のひとは.9000というバージョンを「次バージョンの開発中版」という意味で使うみたいです)、まだリリース前の状態です。

github.com

どんなパッケージなのか

なんかざっくり言うと、

という感じらしいです。スピード狂はfread()を使った方がよさげです。

使ってみる

何はともあれ使ってみます。一番使いそうなCSVを読み込む関数はread_csv()です。

ヘルプにはこんな例が載っています。

# Read from a path
read_csv(system.file("extdata/mtcars.csv", package = "readr"))
# Or directly from a string (must contain a newline)
read_csv("x,y\n1,2\n3,4")

第一引数に何を指定するのか謎です。

ヘルプをもう少し読むと、指定できるものが以下のように書かれています。

Either a path to a file, a url, a connection, or literal data (either a single string or a raw vector). Connections and urls are saved to a temporary file before being read. Literal data is most useful for examples and tests. It must contain at least one new line to be recognised as data (instead of a path).

  • ファイルパス
  • URL
  • コネクション
  • 文字列(CSVのデータそのもの)

が指定できます。改行を含むと文字列と解釈されるようです。改行は例にあるように\nと書いてもいいし、

read_csv("x,y
          1,2
          3,4")

という感じで複数行で書くこともできます。

base(read.csv()とか)との違い

このへん:https://github.com/hadley/readr#output

  • 文字列を勝手にfactorにしない(stringsAsFactors = FALSEが必要ない)
  • 列名を勝手に変換しない(sum(x)sum..x..に変わる、みたいなのが起こらない)
  • クラスはc("tbl_df", "tbl", "data.frame")になる(いちいちas_data_frameとかする必要がない)
  • rownamesは設定されない

などなど

という感じらしいです。

列の型を指定する

col_typesという引数にリストを渡すことで明示的に型を指定できます。うまくその型に変換できなかった値はNAとして扱われます。明示的に指定しなかった列はいい感じに変換してくれるらしいです。

たぶん、こういうfactorで読み込みたいときとか、

read_csv("iris.csv", col_types = list(
  Species = col_factor(c("setosa", "versicolor", "virginica"))
))

時刻を読み込みたいときとかに便利そう。

read_csv("x,y\n10時24分23秒,1\n20時9分59秒,2", col_types = list(x = col_datetime("%H時%M分%S秒")))
#>                     x y
#> 1 1899-12-31 10:24:23 1
#> 2 1899-12-31 20:09:59 2

col_skip()というのを使うとその列をスキップできます。

read_csv('x,O,z
          1,3,9
          9,11,0', col_types = list(O = col_skip()))
#>   x z
#> 1 1 9
#> 2 9 0

文字列と数値だけのときは、c = character, d = double, i = integer, l = logical and _ = skipsのアルファベット一文字ずつを並べて列の型を指定できます。

read_csv('char,dbl,int,logi,skip
 a,1.1,1,T,1', col_types = "cdil_")
#>   char dbl int logi
#> 1    a 1.1   1 TRUE

まあ便利そうなので、様子を見つつ使っていきたいと思います。

細かい話

  • read_csv2は、,の代わりに;をセパレータに使ってるようなCSVを読み込むらしいです(それComma-Separated Valuesちゃうやろ...と思いますが、数字の桁区切りに,を使う国ではこれが一般的らしいです)
  • 文字コードはまだUTF-8しか読み込めないみたいです。(iconvを使う計画はあるようです)。なので、エクセルで保存したCSVを読み込もうとするとエラーが出たりします。エクセルにはreadxlを使いましょう。