2017-05-24 10 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) 

Ich habe diese Funktion geschrieben, um eine gegebene DNA-Sequenz seq2 zu simulieren nach dem Wahrscheinlichkeitsvektor z in dem, wenn die Wahrscheinlichkeit größer als 0,7 dann ist die neue Sequenz eine der anderen drei Nukleotide aufweisen (A, G, T, C) an seiner Stelle. Aber jedes Mal, wenn es einen NULL-Vektor zurückgibt.Simulationen in R Wahrscheinlichkeit unter Verwendung

+1

Sie müssen einige geschweiften Klammern um den Ausdruck, die Ihre Funktion definiert ... 'Funktion (seq2, z) {... ... return (seq2)} ' –

+0

Wenn seq2 eine einzelne Zeichenkette ist, dann ist seq2 [j] NA. –

+0

Ich bin mir auch nicht sicher, 'ersetzen 'ist der richtige Weg, dies zu tun. Verwenden Sie einfach 'seq2 [j] <- sample (c (...), 1)' für jede Anweisung. –

Antwort

1

Hier ist eine kompakte Variante Ihrer Funktion:

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) 
} 

Hier ist, wie es funktioniert:

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 

die letzte Bedingung testen (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

Ich nehme an, dass seq2 ein Zeichenvektor ist und dass z ein Vektor der Stichprobe ist ten, und dass Sie die Positionen in seq2 wo z > 0.7

Eine Möglichkeit, es zu tun ist, erstellen Sie zuerst eine Liste der gültigen Substitutionen mutieren wollen, von den Nukleotiden verkeilt, dann eine Mutation Funktion schreiben, dann sapply, die dem subvector funktionieren von seq2 wo z > 0.7:

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 
} 

Zum Beispiel:

> 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" 
Verwandte Themen