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
これでようやくデータ解析ができます。