1

800000 行と 13000 列のファイルがあります。ファイルは次のようになります。

        ID1 ID2 ID3 ID4 ID5
SNP1    AA  AA  AB  AA  BB
SNP2    AB  AA  BB  AA  AA
SNP3    BB  BB  BB  AB  BB
SNP4    AA  AA  BB  BB  AA
SNP5    AA  AA  AA  AA  AA

文字を数字に置き換えたい (AA = 0、AB = 1、BB = 2)。私がやったことは次のとおりです: data[data=="AA"] = 0 小さな例では問題なく動作しているようですが、大きなファイルでは機能していないようです。何時間もかかりました。それを行うためのより効率的な方法はありますか?どうもありがとうございました。ポーラ。

4

3 に答える 3

2

おそらくこれを試してください:

データを読み込みます:

DF <- read.table(text = "ID1 ID2 ID3 ID4 ID5
SNP1    AA  AA  AB  AA  BB
SNP2    AB  AA  BB  AA  AA
SNP3    BB  BB  BB  AB  BB
SNP4    AA  AA  BB  BB  AA
SNP5    AA  AA  AA  AA  AA
", header = TRUE, sep = "", stringsAsFactors = FALSE) 

> str(DF)
'data.frame':   5 obs. of  5 variables:
 $ ID1: chr  "AA" "AB" "BB" "AA" ...
 $ ID2: chr  "AA" "AA" "BB" "AA" ...
 $ ID3: chr  "AB" "BB" "BB" "BB" ...
 $ ID4: chr  "AA" "AA" "AB" "BB" ...
 $ ID5: chr  "BB" "AA" "BB" "AA" ...

ルックアップ テーブルを作成します。

tab <- c("AA" = 0, "AB" = 1  , "BB" = 2)
> tab
AA AB BB 
 0  1  2

いくつかのサブ割り当てマジック:

> DF[] <- tab[as.matrix(DF)]
> DF
     ID1 ID2 ID3 ID4 ID5
SNP1   0   0   1   0   2
SNP2   1   0   2   0   0
SNP3   2   2   2   1   2
SNP4   0   0   2   2   0
SNP5   0   0   0   0   0
> str(DF)
'data.frame':   5 obs. of  5 variables:
 $ ID1: num  0 1 2 0 0
 $ ID2: num  0 0 2 0 0
 $ ID3: num  1 2 2 2 0
 $ ID4: num  0 0 1 2 0
 $ ID5: num  2 0 2 0 0
于 2015-04-08T02:54:01.687 に答える
2

scanIMO を過度に複雑にする を使用しない限り、ファイルは R には大きすぎる可能性があります。これは、GNU ユーティリティを使用した方が適切に処理できる仕事です。

Windows を使用している場合は、MSYS をインストールします。

http://www.mingw.org/wiki/Getting_Started

次にsed、前述のように使用してテキストを置き換えます。

cat <filename>  | sed "s/\bAA\b/0/g" | sed "s/\bBA\b/1/g" | sed "s/\bAB\b/1/g"  | sed "s/\bBB\b/2/g" > <newfile>

編集:

R を使用する必要がある場合、ファイルには約 100 億のエントリが含まれているため、ファイルを行ごとに読み取る必要がある可能性があります。これは、3 文字のそれぞれが非常に大きなデータセットです!

ファイルを 1 行ずつ読み取るには、SO スレッドを参照してください。

Rでテキストファイルを1行ずつ読む

ただし、これは非常に遅くなると思います。

于 2015-04-08T13:34:36.700 に答える