tidyverse csv・tsvのファイルの読み方・データ型の指定方法 readrパッケージ

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

【関連】R 使い方 データ 読込み テキスト,csv,エクセル,データベース スクリプトの書き方

まとめ

  • tidyverseを使う場合、ファイルの読み書きでは、readrパッケージのread_tsv関数・read_csv関数を使うのが便利。
  • readrパッケージのファイルの読み込み関数では、col_typesオプションを使って、列毎にデータ型を直接指定することができます。
  • readrパッケージを使うと、大きなファイルの読み込みが高速に処理できます。
  • Rの標準的なファイル操作ではオプションを指定する頻度が高く、readrパッケージの方がデフォルト動作で使いやすくなっています。



今週よく読まれている記事

  1. 学会・会議で英語が絶望的にできなくて困るケース | オンライン開催で「英語力のなさ」を痛感した場合の対処法

    学会・会議で英語ができなくてに困るケース学会やイベント・会議などが、オンラインで開催される…
  2. r tidyverse 使い方 | 列 filter 絞り込み select関数 – dplyrパッケージ

    tidyverseで1つのデータフレームの列の絞り込みは、dplyrパッケージのselect関数を…
  3. プログラミングで疲れた脳をリフレッシュ 〜 鬼滅の刃「感動」と「やる気アップ」でストレス発散!

    ストレス発散は鬼滅で。「50%OFF」で読む!脳のパフォーマンスを上げるには、適度な休憩と…
  4. AWS ディスク容量不足 新しいボリュームを追加する

    バイオインフォマティクスでは大きなファイルを扱うことがあるので、ディスク不足に陥ることがあります。…
  5. 「知っている」と「知らない」とでは、もしものとき、大違いになる – コロナうつ対策

    コロナうつなどという言葉を聞くようになりましたが、派遣切り、解雇、リストラは、これから本格化します…

カテゴリー

人気記事

  1. IGV, 解析ツール

    IGV 使い方 インストール〜便利な使い方まで | リファレンス・マッピングデータ・アノテーションを読み込んで表示しよう
    IGV(Integrative Genomics View…
  2. R言語

    R subset関数 データフレームやmatrixからの条件指定による行・列の抽出
    R の subset関数は、データフレームやマトリックスか…
  3. Excel, 統計

    z-score 計算方法 エクセル(Excel) 編
    統計処理で、大きく変化しているなどの判断基準にも使われる値…

おすすめ記事

  1. R言語, グラフ

    R 使い方 軸・ラベルの調整(向き・サイズ・色など) グラフの描き方
    Rによるplot(グラフ)の描画は、手軽で大変便利です。た…
  2. awk, シェルスクリプト

    bash 部分文字列・置換・長さ・連結・分割の文字列処理
    bashのよく使う文字列処理、部分文字列・置換・連結・長さ…
  3. シェルスクリプト

    シェルスクリプト | ファイル存在チェック・空ファイルチェック
    bashでスクリプトを作成するときに、よく使うのがファイル…