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

UBC/informatics/r/data_input_text

このページの最終更新日: 2022/07/26

  1. テキストファイルを読み込む
    • scan を使う方法
    • read.table を使う方法
  2. テキストファイルからコピペする
  3. csv ファイルを読み込む

広告

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

テキストファイル とは、文字コードによって表されるデータのみを含むファイルのことである。書式、スタイル、画像などの余計な情報を含まないので、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"))

テキストファイルからコピペする

上にも書いたように、あまりお勧めの方法ではない。Mac と Windows ではクリップボードの形式が違うので、このコマンドも異なることに注意する。

Mac (おそらく Linux も) では、データファイルにしたい領域をラベルも含めてコピーした後に、

C <- read.table(pipe("pbpaste"))

1 行目をヘッダーにしたいときは

C <- read.table(pipe("pbpaste"), header = TRUE)

とする。ただし、この方法だとデータ型は基本型が list、クラス型が data.frame になり、かつ V1, V2 というデータラベルが勝手につけられてしまう。

Windows では、このコマンドは read.table("clipboard") となる (3)。


Error log

  • Warning message: In read.table(pipe("pbpaste")):incomplete final line found by readTableHeader on 'pbpaste' というメッセージが現れた場合、一番下に一行空白行をクリップボードにコピーするようにすると、このメッセージが出なくなる。
  • Windows R version 3.1.2 では、Error in read.table(pipe("pbpaste")): no lines available in input というエラーが出てしまう。

広告

csv ファイルを読み込む

csv は comma separated values の略で、csv ファイルとはコンマ、スペース、タブなどを区切り文字としたテキストファイルである。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() で調べるとリスト形式になっているようだ。heatmap を描く際には、これは行列 matrix でなければならないので、以下のように変換する。

A_matrix = as.matrix(A)

また、データフレームを csv ファイルとして書き出すときは write.csv なので、read.csv と合わせて覚えておくと良いだろう。


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

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


広告

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.

コメント欄

各ページのコメント欄を復活させました。スパム対策のため、以下の禁止ワードが含まれるコメントは表示されないように設定しています。レイアウトなどは引き続き改善していきます。「管理人への質問」「フォーラム」へのバナーも引き続きご利用下さい。

禁止ワード: http, the, м (ロシア語のフォントです)


このページにコメント

Name:


Comment:



これまでに投稿されたコメント

Date Name Comment

2022-03-10 22:17:29.706341

ZAP

2022-03-10 22:15:10.741840

ZAP

2022-03-10 20:56:19.681262

ZAP