【R tips】テキストファイルで準備したデータをread.csv()で読み込む

タグ: #research #R


Introduction

データをプログラムに直接打ち込むことはあまりありません。データを保存するファイルを作っておいて、それを読み込むことが一般的です。間違ってデータを書き換えてしまう可能性を減らすことができる上、他のプログラムからも同じデータを読み込むことができます。

Rは様々なファイルの読み込みをサポートしています。今回は特にサイズが軽くてエクセルからコピペで作ることができるtxtファイルをデータファイルとして用います。テキストファイルで準備したデータを、ファイルを指定してread.csv()で読み込み、成形する方法です。


テキストファイルの準備

適当なデータファイルを作成します。一つの計測項目について、一つのファイルで保存しています。expt1, expt2, expt3は複数の同じ実験です。

data1.txt

day expt1 expt2 expt3
0 2 4 3
1 3 5 7
2 7 7 8
3 12 11 14

data2.txt

day expt1 expt2 expt3
0 10 14 15
1 23 20 29
2 31 41 39
3 47 49 45

各データ間はタブ区切りです。これはコンマ(,)などなんでも良いですが、タブで区切るのが見やすいです。また、Excelから表をtxtファイルにコピペするとタブ区切りで貼り付けられます。

用意したファイルを適当なディレクトリ"data/"などに保存しましょう。

パスの説明は以下

【R tips】相対パス、ルートパス、ホームディレクトリなど | Shoya Iwanami’s note

データの読み込み

以下のようにして用意したデータファイルを読み込みます。

> setwd("_workingdirectory_") #working directoryの設定
> datatypes <- c("data1", "data2") #読み込むデータのファイル名
> obs_data <- vector(mode="list",length=length(datatypes)) #読み込んだデータを保存するリスト
> for( i in 1:length(datatypes) ) {
+   rfn <- paste("./data/",datatypes[i],".txt",sep="") #読み込むファイルのパス
+   dsf <- read.csv(rfn,sep="\t",header=T) #読み込み
+   obs_data[[i]] <- dsf #読み込んだデータの保存
+ }

まずworking directoryを設定しています。

> setwd("_workingdirectory_") #working directoryの設定

次に、読み込むデータファイルの名前のベクトルを作成しています。これは、forループで必要なデータファイルを全て読み込むためです。

> datatypes <- c("data1", "data2") #読み込むデータのファイル名

読み込んだデータを保存するリストを作成しておきます。長さがlength(datatypes)のリストです。規格が揃っていないデータを扱う際に便利です。

> obs_data <- vector(mode="list",length=length(datatypes)) #読み込んだデータを保存するリスト
> obs_data
[[1]]
NULL

[[2]]
NULL

forループでファイルを一つずつ読み込みます。まず、読み込むファイルの相対パスを設定します。paste()は渡された文字列をつなげた文字列を返してくれます。sep=""としているのでつなげた際の間に何も入れません。今回はworking directoryの直下に"data/"のディレクトリを作成してデータファイルを保存しています。

rfn <- paste("./data/",datatypes[i],".txt",sep="") #読み込むファイルのパス
# rfnは"./data/data1.txt"または"./data/data2.txt"

データが保存されたファイルを読み込みます。読み込まれたデータはdata.frame型で保存されます。read.csv()read.csv("読み込むファイルのパス", sep="データ区切り", header=T or F)として使います。データ区切りは今回タブ区切りなので"\t"となります。headerは一行目を読み込むデータの列名として読み込むかどうかを設定します。Tの場合、一行目は列名として扱われ、Fの場合はデータとして扱われます。

dsf <- read.csv(rfn,sep="\t",header=T) #読み込み

読み込んだデータをリストに保存して終了です。

obs_data[[i]] <- dsf #読み込んだデータの保存

今回の例の場合、データのリストは以下のようになります。

> obs_data
[[1]]
  day expt1 expt2 expt3
1   0     2     4     3
2   1     3     5     7
3   2     7     7     8
4   3    12    11    14

[[2]]
  day expt1 expt2 expt3
1   0    10    14    15
2   1    23    20    29
3   2    31    41    39
4   3    47    49    45

たまに以下のような警告メッセージに遭遇します。これは"data1.txt"の最後の行に改行を入れることで解決します。

警告メッセージ:
1:  read.table(file = file, header = header, sep = sep, quote = quote,  :
  incomplete final line found by readTableHeader on './data/data1.txt'

データの成形

実際に解析に用いるのはデータの平均となることが多いので、成形したら完成です。

> obs_data2 <- vector(mode = 'list', length = length(datatypes))
> for (i in 1:length(datatypes)) {
+     dtimes <- obs_data[[i]][,1]
+     dmeans <- rowMeans(obs_data[[i]][,-1])
+     dsd <- apply(obs_data[[i]][,-1],1,sd)
+     obs_data2[[i]] <- data.frame(time = dtimes, value = dmeans, sd = dsd)
+   }
> obs_data2
[[1]]
  time     value        sd
1    0  3.000000 1.0000000
2    1  5.000000 2.0000000
3    2  7.333333 0.5773503
4    3 12.333333 1.5275252

[[2]]
  time value       sd
1    0    13 2.645751
2    1    24 4.582576
3    2    37 5.291503
4    3    47 2.000000