2016-08-09 3 views
6

長いテーブルの代わりに広いテーブルを作成しようとしていた前の(類似の)投稿hereを書いていました。私は長い形式でテーブルを持っているので、別の質問として投稿しています。私も試したことを投稿しています。R:行が非常に多数のファイルを高速でバインドする

私が使用して〜11000個のファイルについてrbindするRを使用しています:

1:プロットなどを作成するように私の下流の処理は、私は2つの質問があるR.にあるので

# get list of ~11000 files 
lfiles <- list.files(pattern = "*.tsv", full.names = TRUE) 

# row-bind the files 
# use rbindlist to rbind and fread to read files 
# use mclapply I am assigning 32 cores to it 
# add the file basename as the id to identify rows 
dat <- rbindlist(mclapply(lfiles, function(X) { 
data.frame(id = basename(tools::file_path_sans_ext(X)), 
      fread(X))},mc.cores = 32)) 

を私はRを使用していますコードをより効率的に/高速にする方法はありますか?私は最後に期待される行の数を知っているので、データフレームをあらかじめ割り当てておけば助けになるでしょうか? .RDataとして、データベースまたは何か他のもののように - 私はこの巨大なデータ(どのような形式で)保存する必要がありますどのように

2.?

追加情報として:私はこれをやりたい3種類のファイルがあります。それらは次のようになります:

[[email protected] data]$ head C021_0011_001786_tumor_RNASeq.abundance.tsv 
target_id length eff_length est_counts tpm 
ENST00000619216.1 68 26.6432 10.9074 5.69241 
ENST00000473358.1 712 525.473 0 0 
ENST00000469289.1 535 348.721 0 0 
ENST00000607096.1 138 15.8599 0 0 
ENST00000417324.1 1187 1000.44 0.0673096 0.000935515 
ENST00000461467.1 590 403.565 3.22654 0.11117 
ENST00000335137.3 918 731.448 0 0 
ENST00000466430.5 2748 2561.44 162.535 0.882322 
ENST00000495576.1 1319 1132.44 0 0 

[[email protected] data]$ head C021_0011_001786_tumor_RNASeq.rsem.genes.norm_counts.hugo.tab 
gene_id C021_0011_001786_tumor_RNASeq 
TSPAN6 1979.7185 
TNMD 1.321 
DPM1 1878.8831 
SCYL3 452.0372 
C1orf112 203.6125 
FGR 494.049 
CFH 509.8964 
FUCA2 1821.6096 
GCLC 1557.4431 

[[email protected] data]$ head CPBT_0009_1_tumor_RNASeq.rsem.genes.norm_counts.tab 
gene_id CPBT_0009_1_tumor_RNASeq 
ENSG00000000003.14 2005.0934 
ENSG00000000005.5 5.0934 
ENSG00000000419.12 1100.1698 
ENSG00000000457.13 2376.9100 
ENSG00000000460.16 1536.5025 
ENSG00000000938.12 443.1239 
ENSG00000000971.15 1186.5365 
ENSG00000001036.13 1091.6808 
ENSG00000001084.10 1602.7165 

何か助けていただければ幸いです!

ありがとうございます!あなたはこのR. freadrbindlistを使用するよりも高速ですが、を行うことはできません

答えて

5

、あなたはdata.frameを使用してデータをコピーするべきではありません。代わりにby referenceを割り当てて:

DF <- fread(X) 
DF[, id := basename(tools::file_path_sans_ext(X))] 
return(DF) 

ただし、データベースの使用を検討する必要があります。

PS:正しい正規表現は".+\\.tsv$"です。これは、任意のファイル名と1つ以上の文字とそれに続くドットと文字列 "tsv"とファイル名の末尾の後に続くものと一致します。質問1.について

3

、顕著な違いがあるでしょう場合、私は確かに言うことはできませんが、(彼の答えに@Rolandで述べたように)data.frame呼び出しを避けるために、次の試みることができる:

lfiles <- list.files(pattern = ".*\\.tsv$", full.names = TRUE) 
setattr(lfiles, "names", basename(lfiles)) 
dat <- rbindlist(mclapply(lfiles, fread, mc.cores = 32), idcol = "id") 

ここでは、のコメントをrbindlistの中に使用することができます。

質問について2.、私はあなたの分析で後で何をしたいかによって決まると思います。

+0

lfilesがデータフレームではないため、 'setnames(lfiles、basename(lfiles)'は何をしていますか? –

+0

@KomalRathi、リストでも動作する 'setattr'を使うように修正されました。 –

関連する問題