R オブジェクトの作成:
テキストファイルからのデータの読み込み

UBC/informatics/r/data_input_text

このページの最終更新日: 2024/03/10

  1. テキストファイルを読み込む
  2. csv ファイルを読み込む
  3. tsv ファイルを読み込む

関連ページ


広告

テキストファイルを読み込む

テキストファイル とは、文字コードによって表されるデータのみを含むファイルのことである。書式、スタイル、画像などの余計な情報を含まないので、R を始め文字列情報を扱う環境では重宝される。

このページでは、テキストファイルを読み込むか、テキストファイルからのコピペでデータを R オブジェクトとして保存する方法についてまとめる。

クリップボードの形式が Mac と Win で違ったりするので、コピペで読み込むのはあまりお勧めしない。ファイルを読み込む方がエラーが少ない。


scan を使う方法

最初の例として、以下のような改行で区切られたテキストファイルがどのように読み込まれるが調べてみる。

1
2
3
4

このテキストファイルの名前が text.txt だとして、A というオブジェクトに読み込む場合、以下のようにする。Read 4 items という表示が出て、読み込まれたデータの数を教えてくれる。

A <- scan("test.txt")

なお、R の作業ディレクトリに text.txt がある場合は上記のコマンドで OK だが、そうでない場合は setwd() で作業ディレクトリを指定するか、ファイルのパスを指定する。list.files() で、カレントディレクトリにある R オブジェクトでないファイルを見ることができる。

また、この矢印 <- は等号 = でも OK であるが、関数のオプションを指定する際に = が使われることがあり、それと区別できるように <- を使うのが一般的な気がする。

A を表示すると [1] 1 2 3 4 のようになる。typeof(A) は doulbe を与える。よってオブジェクト型はベクターで、自明なので vector と表示されないことになる。is.vector(A) は TRUE、mode(A) は numeric となる (参考: R のデータフォーマット)。

次に、データが文字列の場合。

A
B
C
D

同じコマンドを実行すると、

Error in scan("test.txt") : scan() expected 'a real', got 'A'

というエラーになる。scan は実数 real を想定しているので、文字列のデータはそのままでは読み込めず、次のようにオプションを加える必要がある。

B <- scan("test.txt", what=character())

typeof(B) は character、is.vector(B) は TRUE となり、一次元の文字列ベクターとしてテキストファイルが読み込まれたことになる。


read.table を使う方法

上記の数字およびテキストのデータは、以下のように read.table を使っても読み込むことができる。

C <- read.table("test.txt")

read.table と scan との違いは以下の通り。

  • incomplete final line found by readTableHeader on 'test.txt' というエラーが出た。これは最後の行に改行がない場合にみられるエラーである。デフォルトの read.table では、データは改行で区切られていると考える。ただし、エラーは出るものの、最後の行もちゃんと読み込んでくれる。
  • typeof(C) は list、is.data.frame(C) は TRUE を与える。値の 1, 2, 3, 4 は 1 行目 V1 に格納される。

read.table で文字列データを読み込むと、ちょっとややこしい結果になる。

最終行に改行が必要なのは数値データと同じ。オブジェクト型は list である。mode(B$V1) のようにして読み込まれたデータのモードを調べると、numeric と出てくる。どうもアルファベットまで数字として認識されているようである。read.table でデータ型を指定するには以下のようにする。

C <- read.table("test.txt", colClasses = c("character"))

csv ファイルを読み込む

csv は comma separated values の略で、csv ファイルとはコンマ、スペース、タブなどを区切り文字としたテキストファイルである (参考: csv ファイルとは)。

read.csv() 関数

R base パッケージにある read.csv() 関数が基本である。データフレームを csv ファイルとして書き出すときは write.csv なので、read.csv と合わせて覚えておくと良いだろう。

read.csv("filename.csv", header = TRUE/FALSE, row.names = 1)

  • 同じディレクトリに csv ファイルがない場合は、もちろんパスを指定しなければならない。現在のディレクトリは > getwd() で調べることができる。
  • ヘッダー行に情報がない場合、X という文字が割り振られる。複数あると X, X.1, X.2... となる。
  • データに情報がない場合、NA が割り振られる。
  • row.names = 1 は、1 行目を列の名前として使うという意味。

read.csv() で読み込まれたデータは、typeof() で調べるとリスト形式になっているようだ。

# 行列 matrix への変換: heatmap を描く際など。
A_matrix = as.matrix(A)


read_csv() 関数

tidyverse パッケージ にある read_csv() 関数も便利である。

read_csv("filename.csv", col_names = TRUE/FALSE)

read.csv() と read_csv() の挙動の違い。

  • read.csv では空の csv ファイルがあるとエラーになり、for loop は止まってしまうが、read_csv では何も読み込まず次に進みそう。

read.delim() 関数

csv の区切りが反映されない場合、read.delim を使うこともできる。形式は同じ。

read.delim("filename.csv", header = TRUE/FALSE)

tsv ファイルを読み込む

tsv ファイル (タブ区切りテキストファイル) は read.table で読み込める。

  • 1 行目をヘッダーにしたいときは header = TRUE とする。

広告

References

  1. R でのテキストファイル読み出しと書き込み. Link: Last access 2020/01/25.
  2. R:read.csv / read.tableで型と列名を指定して読み込む。Link: Last access 2020/01/25.
  3. 井関龍太のページ. Rでクリップボードからデータを読み込む. Link: Last access 2018/12/09.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。