Rでデータを読み込む

プロテオミクスのデータ(タブ区切りテキスト)をRで解析しようとしたところ、データの読み込みでつまづきました。その改善の足跡です。

とりあえずread.tableで読み込む

> a <- read.table("ALL_Proteins.txt")
scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  でエラー:
line 1 did not have 557 elements

1行目(見出し)でエラーになります。

列数を調べる

557個も列はないはずなので、1行目だけを読み込んで手動で調べてみます。

> head <- scan("ALL_Proteins.txt", sep = "\n", what = 'c', n = 1)
Read 1 item
> head <- strsplit(head, "\t")
> length(head[[1]])
[1] 148

手動でタブ区切りを分割してみると適当な数(148)がでてきました。read.tableのデフォルトの区切り文字は空白で、見出しに空白が含まれているのが最初のエラーの原因のようでした。タブのみを区切りにして読み込み直します。

> a <- read.table("ALL_Proteins.txt", sep = "\t")
scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  でエラー:
line 1 did not have 148 elements

またしても1行目の読み込みで失敗です。

区切り文字を指定して読み込む

1行目をみてみると、#に気が付きます。この記号はコメントを書き込むのによく使われていて、read.tableでもcomment.charに設定されています。#があると以降の文字がコメントとして扱われ、列名が実質的に消えていることが原因でした。元のファイルにはコメントがないので#をコメントとして扱わないように変更しました。

> a <- read.table("2021-094/ALL_Proteins.txt", sep = "\t", comment.char = "")
警告メッセージ:
1:  scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  で:
クオートで囲まれた文字列中にEOFがあります
2:  scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  で:
読み込まれた項目数が、列数の倍数ではありませんでした

今度はクオートに関連したエラーがでました。

クオート文字を指定する

「クオートで囲まれた文字列中にEOFがあります」というエラーなので、文字列をくくる記号が悪さをしているようです。調べてみると、Pyridoxal-5′-phosphate-dependentのようにシングルクオーテーションを含んだ文字があり、これの対応が壊れていることが原因でした。元のデータではダブルクオーテーションのみが文字列をくくるのにつかわれていたので、read.tableのquoteオプションを設定して再度読み込みます。

> a <- read.table("ALL_Proteins.txt", sep = "\t", comment.char = "", quote = '"')
> dim(a)
[1] 7433  148

今度は正常に読み込めました。

見出しを設定する

元のデータの1行目は見出しですが、データとして扱われています。文字データが混在していると数値としての扱いができないので、。header = Tを追加しました。
この時点ではタンパク質のアノテーションなどはfactorとして読み込まれています。factorだと検索をかけることができない(特定の語を含むデータを抽出できない)ので、文字列のまま読み込むために as.is = Tを追加します。

> a <- read.table("ALL_Proteins.txt", sep = "\t", comment.char = "", quote = '"', header = T, as.is = T)
> dim(a)
[1] 7432  148

これでようやくデータ解析ができます。