tidyverseを使う場合、ファイルの読み書きにはreadrパッケージの専用関数(read_tsv関数・read_csv関数)を使うのが便利です。これらの専用関数ではデータ・フレーム構造より使いやすいtibble型でデータを読み込みますが、ファイルの各列のデータ型を直接指定することもできます。更に、readrのパッケージでは、大きなファイルの読み込みを高速に処理できます。このような特長から、Rの標準的なファイル処理よりも使いやすくなっています。

ファイルの読み込み・ファイルの書き出し
readrパッケージには、タブ区切り(tsv)やカンマ区切り(csv)などの、よく使うファイル形式の読み書き用に専用関数が準備されています。tidyverseパッケージをロードすると使えるようになります。読み込んだデータは、データ・フレーム型が改良されたtibble型になります。
専用関数
- read_csv, read_tsv
- ファイル読み込む(カンマ区切り・タブ区切り)
- write_csv, write_tsv
- ファイル書き込み(カンマ区切り・タブ区切り)
ファイルの読み書き
tidyverseをロードすると、readrパッケージも自動的にロードされて、専用関数が使えるようになります。サンプルとして、「read_csv関数」を使ってカンマ区切りのファイル読み込みを行い、「write_tsv関数」を使ってタブ区切りでファイル出力を行いました。
1: $ head -n5 iris.csv 2: 5.1,3.5,1.4,0.2,setosa 3: 4.9,3.0,1.4,0.2,setosa 4: 4.7,3.2,1.3,0.2,setosa 5: 4.6,3.1,1.5,0.2,setosa 6: 5.0,3.6,1.4,0.2,setosa
1: > library(tidyverse) 2: 3: # csvファイル 読み込み 4: > iris_data <- read_csv("iris.csv", 5: col_names = c("Sepal.Length", "Sepal.Width", 6: "Petal.Length", "Petal.Width", 7: "Species")) 8: Parsed with column specification: 9: cols( 10: Sepal.Length = col_double(), 11: Sepal.Width = col_double(), 12: Petal.Length = col_double(), 13: Petal.Width = col_double(), 14: Species = col_character() 15: ) 16: 17: > iris_data 18: # A tibble: 150 x 5 19: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 20: <dbl> <dbl> <dbl> <dbl> <chr> 21: 1 5.1 3.5 1.4 0.2 setosa 22: 2 4.9 3 1.4 0.2 setosa 23: 3 4.7 3.2 1.3 0.2 setosa 24: 4 4.6 3.1 1.5 0.2 setosa 25: 5 5 3.6 1.4 0.2 setosa 26: 6 5.4 3.9 1.7 0.4 setosa 27: 7 4.6 3.4 1.4 0.3 setosa 28: 8 5 3.4 1.5 0.2 setosa 29: 9 4.4 2.9 1.4 0.2 setosa 30: 10 4.9 3.1 1.5 0.1 setosa 31: # … with 140 more rows 32: 33: # tsvファイル 書き込み 34: > write_tsv(iris_data, "iris.tsv")
1: $ head iris.tsv 2: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 3: 5.1 3.5 1.4 0.2 setosa 4: 4.9 3 1.4 0.2 setosa 5: 4.7 3.2 1.3 0.2 setosa 6: 4.6 3.1 1.5 0.2 setosa 7: 5 3.6 1.4 0.2 setosa 8: 5.4 3.9 1.7 0.4 setosa 9: 4.6 3.4 1.4 0.3 setosa 10: 5 3.4 1.5 0.2 setosa 11: 4.4 2.9 1.4 0.2 setosa
tibbleデータ
ファイルから読み込んだデータは、tibbleデータになります。Rの標準的なデータ構造であるデータ・フレームに似ていますが、より使いやすくなるように再定義されたデータ構造です。単独列だけ残ってもデータ・フレーム様な挙動が維持されたり、過剰なデータ表示、ファクターへの自動変換の抑制などの特長があります。
1: > library(tidyverse) 2: 3: # csvファイル 読み込み 4: > iris_data <- read_csv("iris.csv", 5: col_names = c("Sepal.Length", "Sepal.Width", 6: "Petal.Length", "Petal.Width", 7: "Species")) 8: 9: > str(iris_data) 10: Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 150 obs. of 5 variables: 11: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 12: $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... 13: $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 14: $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 15: $ Species : chr "setosa" "setosa" "setosa" "setosa" ... 16: - attr(*, "spec")= 17: .. cols( 18: .. Sepal.Length = col_double(), 19: .. Sepal.Width = col_double(), 20: .. Petal.Length = col_double(), 21: .. Petal.Width = col_double(), 22: .. Species = col_character() 23: .. ) 24: 25: > iris_data 26: iris_data 27: # A tibble: 150 x 5 28: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 29: <dbl> <dbl> <dbl> <dbl> <chr> 30: 1 5.1 3.5 1.4 0.2 setosa 31: 2 4.9 3 1.4 0.2 setosa 32: 3 4.7 3.2 1.3 0.2 setosa 33: 4 4.6 3.1 1.5 0.2 setosa 34: 5 5 3.6 1.4 0.2 setosa 35: 6 5.4 3.9 1.7 0.4 setosa 36: 7 4.6 3.4 1.4 0.3 setosa 37: 8 5 3.4 1.5 0.2 setosa 38: 9 4.4 2.9 1.4 0.2 setosa 39: 10 4.9 3.1 1.5 0.1 setosa 40: # … with 140 more rows 41: 42: > iris_data[,1] 43: # A tibble: 150 x 1 44: Sepal.Length 45: <dbl> 46: 1 5.1 47: 2 4.9 48: 3 4.7 49: 4 4.6 50: 5 5 51: 6 5.4 52: 7 4.6 53: 8 5 54: 9 4.4 55: 10 4.9 56: # … with 140 more rows
データの型を指定する
readrパッケージの専用関数でファイルを読み込む場合、各列の読み込みの型を関数のオプションとして指定できます。データ型の指定は、col_typesで指定します。簡単に指定できる省略記法もあります。必要な列だけ指定することができます。
型を指定する方法
ファイルを読み込むとき、各列の読み込みの型をcol_typesオプションで、データ型をリストで順番に指定します。
- 文字列
- col_charactor()
- 整数
- col_integer()
- 実数
- col_double()
- 列を読み込まない
- col_skip()
他にも、時間・日付・ファクターなどのデータ型を明示的に指定することができます。
1: $ cat test.tsv 2: name data1 data2 3: aaa 1 1.0 4: bbb 2 2.0 5: ccc 3 3.0
1: > test_data <- read_tsv("test.tsv", col_types = list(col_character(), col_integer(), col_double())) 2: 3: > test_data 4: # A tibble: 3 x 3 5: name data1 data2 6: <chr> <int> <dbl> 7: 1 aaa 1 1 8: 2 bbb 2 2 9: 3 ccc 3 3
省略して指定する方法
col_typesオプションでよく使う省略記法です。文字列で指定します。
- 文字列
- “c”
- 整数
- “i”
- 実数
- “d”
- 日付
- “D”
- 列を読み込まない
- “_”
上記と同じサンプルを読み込んだ場合、キャラクター・整数・実数の順に列を読み込む場合は、”cid”と指定します。
1: >test_data <- read_tsv("test.tsv", col_types = "cid") 2: 3: > test_data 4: # A tibble: 3 x 3 5: name data1 data2 6: <chr> <int> <dbl> 7: 1 aaa 1 1 8: 2 bbb 2 2 9: 3 ccc 3 3
必要な列だけ指定する方法
必要な列のみ指定したい場合は、col_typesオプションで列名指定します。
1: >test_data <- read_tsv("test.tsv", col_types = cols(data1 = col_integer())) 2: 3: > test_data 4: # A tibble: 3 x 3 5: name data1 data2 6: <chr> <int> <dbl> 7: 1 aaa 1 1 8: 2 bbb 2 2 9: 3 ccc 3 3
大きなファイルの読み込み
readrパッケージを使うと、数百万行ある大きなファイルも高速で読み込むことができます。Rの標準的なファイル読み込みに比べて、読み込みにかかる時間が半分ほどに短縮されました。Rの標準的な方法で読み込んだ場合(read.csv関数)、約7.2秒かかりました。
1: > system.time( 2: + read_csv("Forbes2000_big.csv") # 約200万行・ファイルサイズ168MB 3: + ) 4: user system elapsed 5: 2.872 0.084 2.956
R ファイル読み書き 標準的な方法
Rの標準的なファイルの読み込みは、read.table関数を使う方法です。データ区切り文字をオプションで指定することで、様々なデータフォーマットのファイルを読み込むことができます。ヘッダーの有無や行の名前をどうするかなどのオプションを指定して使うことが多いです。列ごとのデータ型も指定可能です。書き込みは、区切り文字を指定して、write.csv関数を使います。よく使うフォーマットについては、read.csv関数やread.table関数(タブ区切り)などのラッパー関数が準備されています。
1: > iris_data <- read.table("iris.csv", 2: sep = ",", 3: colClasses = c("numeric", 4: "numeric", 5: "numeric", 6: "numeric", 7: "factor")) 8: > names(iris_data) <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species") 9: 10: > head(iris_data) 11: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 12: 1 5.1 3.5 1.4 0.2 setosa 13: 2 4.9 3.0 1.4 0.2 setosa 14: 3 4.7 3.2 1.3 0.2 setosa 15: 4 4.6 3.1 1.5 0.2 setosa 16: 5 5.0 3.6 1.4 0.2 setosa 17: 6 5.4 3.9 1.7 0.4 setosa 18: 19: > write.table(iris_data, "iris2.tsv", sep = "\t", quote=F, col.names=T, row.names=F)
1: $ head -n5 iris2.tsv 2: Sepal.Length Sepal.Width Petal.Length Petal.Width Species 3: 5.1 3.5 1.4 0.2 setosa 4: 4.9 3 1.4 0.2 setosa 5: 4.7 3.2 1.3 0.2 setosa 6: 4.6 3.1 1.5 0.2 setosa

まとめ
- tidyverseを使う場合、ファイルの読み書きでは、readrパッケージのread_tsv関数・read_csv関数を使うのが便利。
- readrパッケージのファイルの読み込み関数では、col_typesオプションを使って、列毎にデータ型を直接指定することができます。
- readrパッケージを使うと、大きなファイルの読み込みが高速に処理できます。
- Rの標準的なファイル操作ではオプションを指定する頻度が高く、readrパッケージの方がデフォルト動作で使いやすくなっています。
論文・データ解析の支援
個別に直接相談できるのが良いと、たくさんの方にご利用頂いています。


関連記事








