2016-10-12 3 views
1

私は500個以上のファイル(df1)をフォルダに持っており、参照テーブル(nf1)とマージして新しいファイルを作成したい)。forループと比較して参照データとのマージにより新しいデータフレームを作成

data[1] <- Composite.REF Call Confidence 
      SNP_A-2131660 2  0.0053 
      SNP_A-1967418 2  0.0075 
      SNP_A-1969580 2  0.0042 
      SNP_A-4263484 2  0.0052 
nf1 <- 
    Composite.REF dbSNP.RS.ID Chromosome  Physical.Position Allele.A Allele.B Gene region 
     SNP_A-2131660 rs4147951  2   66943738   A   G  ABCA8 intron 
     SNP_A-1967418 rs2022235  2   14326088   C   T  ---  downstream 
     SNP_A-1969580 rs6425720  2   31709555   A   G  NKAIN1 intron 
     SNP_A-4263484 rs12997193  2   106584554   A   C  ---  upstream 

finalFile <- 

     Composite.REF dbSNP.RS.ID Chromosome  Physical.Position Allele.A Allele.B Gene region data[1] 
     SNP_A-1969580 rs6425720  2   31709555   A   G  NKAIN1 intron  0.042 




listFiles <- list.files(pattern = "data.txt$",recursive=T) # list all the files with extension data.txt 

    for (i in 1:length(listFiles)){ 
     data<-read.table(file=paste(listFiles[i]), sep="\t", skip=1, header=T) 
     dataF <-data[data$Confidence < 0.05,] #add a filter 
     finalFile <- merge(dataF, nf1, by = "Composite.Element.REF") #merge 2 data based on common column 
     write.table(finalFile, gsub("data.txt", "data_new.txt" ,listFiles[i]), sep = "\t", row.names=F, quote=F) #save the output 
     } 

これは、一度に1つのサンプルをループするので、完了には多くの時間がかかります。私は仕事のためによりエレガントであるかどうかを知りたい。

+0

はあなたの最も遅い部分であるかを確認するためのコードをプロファイリングしようとした持っています仕事? 'read.table'行の場合は' data.table :: fread'を試してみてください。 – bouncyball

+0

read.tableとfreadはほぼ同じ時間がかかります。各ファイルを時間通りにルーピングするのではなく、500個のファイルすべてに対して並列に実行する方法はありますか? – beginner

+0

'plyr'パッケージを使用して、すべてのデータを1つの結合データフレームにロードし、参照と一度マージして、大きなデータフレームのチャンクを別々のファイルに保存することができます。 'adply()'と 'd_ply()'を参照してください。 – jdobres

答えて

1

それはいくつかのデータのないこの質問に答えることは非常に困難だが、plyrパッケージには、あなたがこのような何かを行うことができるようになる:

library(plyr) 

data.main <- adply(listFiles, 1, read.table, sep="\t", skip=1, header=T) # load all files 
data.main <- subset(data.main, Confidence < 0.05) # reduce data by cutoff value 
data.main <- merge(data.main, nf1, by = 'Composite.Element.REF') # merge data sets 

# write out all files 
d_ply(data.main, .(.id), function(x) { 
    file.name <- sprintf('new data %i.txt', listFiles[x$.id[1]]) 
    write.table(x, file.name, sep = "\t", row.names=F, quote=F) #save the output 
}) 
+0

私は例のデータで質問を更新しました – beginner

関連する問題