一連のDNA配列ファイル(fasta形式)のヌクレオチド多様性を計算するために、Rでスクリプトを作成しました。ネストされたforループを使用してそれを行うことができます(以下のコードを参照)。ただし、計算上非常に非効率的です。ifelse関数とsapply関数を試しましたが、それを機能させる方法を理解できます。誰かが私がこのコードを最適化するのを手伝ってもらえますか?
# This code works but it’s very inefficient:
library(pegas)
setwd(dir="d:/my_directory")
file.names<-dir(pattern=".fasta")
# Create a nucleotide diversity matrix:
exple<-matrix(nrow=10,ncol=10)
rownames(exple)<-paste("sample",c(1:10),sep="_")
colnames(exple)<-paste("species",c(1:10),sep="_")
# Create a function to read DNA sequences and calculate nucleotide diversity:
pi=function(x,y){
my_seq<-read.dna(paste(x,y,"fasta",sep="."),format="fasta",as.matrix=FALSE)
nuc_div<-nuc.div(my_seq)
}
# Iterate over rows and columns
for(m in 1:nrow(exple)){
for(o in 1:ncol(exple)){
if(paste(colnames(exple)[o],rownames(exple)[m],"fasta",sep=".") %in% dir()){
divp <- pi(colnames(exple)[o],rownames(exple)[m])
exple[m,o]<-divp
}
}
}
それを効率的にするための私の試み(多くの1つ):
exple2<-melt(exple,varnames=c("sample","species"))
exple2$exist<-ifelse(paste(exple2$species,exple2$sample,"fasta",sep=".") %in% dir(),1,0)
exple2$value<-ifelse(exple2$exist==1,
sapply(exple2$sample, function(x){
pi(exple2$species,exple2$sample)
}),"NA")
# I get this error
Error in file(con, "rb") : invalid 'description' argument
# Traceback
10. file(con, "rb")
9. readBin(file, "raw", sz)
8. read.FASTA(file)
7. read.dna(paste(x, y, "fasta", sep = "."), format = "fasta", as.matrix = FALSE)
6. pi(exple2$otu_id, exple2$sample_id)
5. FUN(X[[i]], ...)
4. lapply(X = X, FUN = FUN, ...)
3. sapply(exple2$sample_id, function(x) { pi(exple2$otu_id, exple2$sample_id) })
2. sapply(exple2$sample_id, function(x) { pi(exple2$otu_id, exple2$sample_id) })
1. ifelse(exple2$exist == 1, sapply(exple2$sample_id, function(x) { pi(exple2$otu_id, exple2$sample_id) }), "NA")
read.dna
1の長さを期待するファイル引数に複数の要素のベクトルを渡すため、エラーが発生します。基本的に2つの文字ベクトル間のすべての組み合わせを実行しているmapply
ため、expand.grid
データフレームを要素ごとにループダウンして、必要な結果の行列を作成することを検討してください。さらに、tryCatch
不足しているファイルに使用します。
pi <- function(x, y) {
tryCatch({
my_seq <- read.dna(paste(x, y, "fasta", sep="."),
format="fasta", as.matrix=FALSE)
return(nuc.div(my_seq))
}, error = function (e) return(NULL)
)
}
# DATA FRAME OF ALL POSSIBLE COMBINATIONS (nrow = 100, ncol = 2)
params_df <- expand.grid(sample = paste("sample", c(1:10), sep="_"),
species = paste("species", c(1:10), sep="_"))
# CAST NUMERIC VECTOR INTO MATRIX OF DEFINED DIMS
exple <- matrix(mapply(pi, params_df$species, params_df$sample),
nrow = 10, ncol = 10,
dimnames = list(paste("sample", c(1:10), sep="_"),
paste("species", c(1:10), sep="_"))
)
とはいえ、I / Oプロセスでファイルを繰り返し読み取るため、ベクトル化できないため、このソリューションはそれほど高速ではない可能性がありますが、for
1つの非表示の適用ファミリループに複数のネストされたループを回避できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加