2016-03-03 18 views
6

sto essenzialmente cercando di risolvere questo problema: http://rosalind.info/problems/revc/Come sostituire diversi caratteri di una stringa con Julia

voglio sostituire tutte le occorrenze di A, C, G, T con i loro complimenti T, G, C , A .. in altre parole, tutte le A saranno sostituite con T, tutte le C con G ed ecc.

Avevo già utilizzato la funzione replace() per sostituire tutte le occorrenze di "T" con "U" e speravo che sostituire la funzione richiederebbe un elenco di caratteri da sostituire con un altro elenco di caratteri, ma non sono stato in grado di farlo funzionare, quindi potrebbe non avere quella funzionalità.

So che potrei risolvere questo facilmente utilizzando il pacchetto BioJulia e lo hanno fatto usando la seguente:

# creating complementary strand of DNA 
# reverse the string 
# find the complementary nucleotide 
using Bio.Seq 
s = dna"AAAACCCGGT" 

t = reverse(complement(s)) 

println("$t") 

ma mi piacerebbe non dover fare affidamento sulla confezione.

Ecco il codice che ho finora, se qualcuno potesse guidarmi nella giusta direzione sarebbe fantastico.

# creating complementary strand of DNA 
# reverse the string 
# find the complementary nucleotide 

s = open("nt.txt") # open file containing sequence 

t = reverse(s) # reverse the sequence 

final = replace(t, r'[ACGT]', '[TGCA]') # this is probably incorrect 
# replace characters ACGT with TGCA 

println("$final") 

risposta

5

Sembra che replace non ancora fare traduzioni del tutto come, ad esempio, tr in Bash. Così, invece, qui sono un paio di approcci che utilizzano una mappatura dizionario invece (il pacchetto BioJulia appare anche a fare uso simile di dizionari):

compliments = Dict('A' => 'T', 'C' => 'G', 'G' => 'C', 'T' => 'A') 

Poi, se str = "AAAACCCGGT", si potrebbe usare join come questo:

julia> join([compliments[c] for c in str]) 
"TTTTGGGCCA" 

altro approccio potrebbe essere quella di utilizzare una funzione e map:

function translate(c) 
    compliments[c] 
end 

Poi:

julia> map(translate, str) 
"TTTTGGGCCA" 

Le stringhe sono oggetti iterabili in Julia; ognuno di questi approcci legge un carattere a turno, c, e lo passa al dizionario per recuperare il carattere complementare. Una stringa nuova è costituita da questi caratteri complementari.

Le stringhe di Julia sono anche immutabili: non è possibile scambiare i caratteri sul posto, ma è necessario creare una nuova stringa.

+0

Questo funziona perfettamente quando fornisco str = "AAACCCGGT", ma se provo ad aprire un file e ottenere la stringa in questo modo, ottengo un errore 'non trovato in getindex a dettare'. Inoltre, potresti approfondire un po 'come la funzione in basso risolve il mio problema? In che modo l'indicizzazione del dizionario altera la mia stringa? Attualmente sto leggendo Mastering Julia, ma sono solo alcuni capitoli e ho appena preso Julia ieri, quindi mentre capisco un po ', sono ancora abbastanza estraneo ad alcuni dei meccanici, essendo questo uno. – System

+1

Registra l'errore, è possibile che tu stia leggendo nella nuova riga dal file. Questi non sono mappati dal dizionario, quindi l'errore si presenta. Potresti provare 'map (translate, readchomp (s))'. –

+1

'map (translate, str)' restituirà una nuova stringa tradotta basata su str, allo stesso modo 'replace (str, match, replacement)' restituirà anche una nuova stringa, cioè: 'x =" test "; y = replace (x, 'e', ​​'E'); x, y' restituisce '(" test "," tEst ")'. ** ** non aggiorneranno la stringa originale sul posto! – SalchiPapa

Problemi correlati