2017-05-24 18 views
0
myfunction3 <- function(seq2,z) 


for(j in 1:100) 

{ 

if(z[j]>0.7) 

{ 
if(seq2[j] =='A') replace(seq2,j,sample(c("C","G","T"),1)) 

else if(seq2[j] =='G') replace(seq2,j,sample(c("C","A","T"),1)) 

else if(seq2[j] =='T') replace(seq2,j,sample(c("C","G","A"),1)) 

else if(seq2[j] =='C') replace(seq2,j,sample(c("A","G","T"),1)) 

else if(seq2[j]=='E') replace(seq2,j,'T') 

} 

} 

return(seq2) 

確率ベクトルzに従って与えられたDNA配列seq2をシミュレートするこの関数では、確率が0.7より大きい場合、新しい配列は他の3つのヌクレオチドのいずれかを持つことができます(A、G、T、C)を代用します。しかし、毎回NULLベクトルが返されます。ここで確率を使ったRのシミュレーション

+1

あなたは '関数(SEQ2、...あなたの関数を定義する式の周りにいくつかの中括弧を必要としますz){... ... return(seq2)} ' –

+0

seq2が単一の文字列の場合、seq2 [j]はNAです。 –

+0

また、私は 'replace'がこれを行う正しい方法であるとは確信していません。それぞれの文に 'seq2 [j] < - sample(c(...)、1)'を使ってください。 –

答えて

1

は、あなたの関数のコンパクトな変種です:

myfunction3 <- function(seq2,z) { 
    for(j in which(z>0.7)) 
    seq2[j] <- switch(seq2[j], 
         A=sample(c("C","G","T"),1), 
         G=sample(c("C","A","T"),1), 
         T=sample(c("C","G","A"),1), 
         C=sample(c("A","G","T"),1), 
         E="T" 
    ) 
    return(seq2) 
} 

ここにそれがどのように働くかある:

set.seed(42) 
z <- sample(1:10)/10 
seq <- sample(c("A","G","T", "C"), 10, repl=TRUE) 
data.frame(seq, z, seq2=myfunction3(seq,z)) 
# seq z seq2 
# 1 G 1.0 T 
# 2 T 0.9 C 
# 3 C 0.3 C 
# 4 G 0.6 G 
# 5 G 0.4 G 
# 6 C 0.8 T 
# 7 C 0.5 C 
# 8 A 0.1 A 
# 9 G 0.2 G 
# 10 T 0.7 T 

テスト最後の条件(E = "T"):

set.seed(42) 
z <- sample(3:17)/10 
seq <- sample(c("A","G","T", "C", "E"), length(z), repl=TRUE) 
data.frame(seq, z, seq2=myfunction3(seq,z)) 
1

seq2は文字ベクトルであり、zはサンプルのベクトルです。leng目とそれを行うにはz > 0.7

一つの方法は、サブベクトルに機能するsapply、その後、最初の突然変異の機能を記述した後、ヌクレオチドをキーと有効な置換のリストを作成することですどこにseq2の位置を変異させたいこと例えば

substitutions <- list(A = c("C","G","T"), 
        G = c("A","C","T"), 
        T = c("A","C","G"), 
        C = c("A","G","T"), 
        E = c("T")) 

mutate <- function(nucleotide){ 
    sample(substitutions[[nucleotide]],1) 
} 

myfunc <- function(seq2,z){ 
    to.change <- which(z > 0.7) 
    seq2[to.change] <- sapply(seq2[to.change],mutate) 
    seq2 
} 

z > 0.7seq2

> s <- sample(c("A","T","G","C","E"),10, replace = T) 
> z <- sample(c(0,0.8),10, replace = T) 
> rbind(s,z,myfunc(s,z)) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
s "E" "A" "C" "G" "E" "C" "E" "T" "E" "A" 
z "0.8" "0" "0" "0.8" "0" "0.8" "0.8" "0.8" "0" "0.8" 
    "T" "A" "C" "C" "E" "A" "T" "G" "E" "T" 
関連する問題