Digamos que eu tenha uma sequência como myseq
a abaixo. É uma sequência de DNA, então cada grupo de 3 letras faz uma letra (aminoácido) na myaa
sequência que a acompanha. Ela tem um comprimento de 13aa.
Quero criar um mydf
dataframe com as posições inicial e final de cada grupo de 3 letras em myseq
. No exemplo básico abaixo sem lacunas, faço isso facilmente com seq()
.
myseq <- "CTACGTAGCTAGCTGGGGTACCGTTATTCAGCTAGCATG"
myaa <- "XYZWWXZZVVYZX"
st_pos <- seq(1, nchar(myseq)-2, 3)
en_pos <- seq(3, nchar(myseq), 3)
mydf <- data.frame(starts=st_pos, ends=en_pos, label=unlist(strsplit(myaa, "")))
Isso produz este dataframe, que é exatamente o que eu quero:
> mydf
starts ends label
1 1 3 X
2 4 6 Y
3 7 9 Z
4 10 12 W
5 13 15 W
6 16 18 X
7 19 21 Z
8 22 24 Z
9 25 27 V
10 28 30 V
11 31 33 Y
12 34 36 Z
13 37 39 X
No entanto, estou encontrando exemplos com meus dados reais que myseq
contêm lacunas. Nesses casos, não posso confiar seq()
porque preciso levar em conta as lacunas para as posições inicial e final.
Como devo fazer isso? Mostro a vocês 2 casos abaixo, e meu mydf
dataframe esperado, para o qual eu apenas codifiquei as posições inicial e final.
#case 1 - gaps breaking groups of 3 letters in half
myseq <- "CTACGTAGCTAGCTGGGGTACCGTT---ATTC--AGCTAGCATG"
st_pos <- c(1,4,7,10,13,16,19,22,25,31,36,39,42)
en_pos <- c(3,6,9,12,15,18,21,24,30,35,38,41,44)
mydf <- data.frame(starts=st_pos, ends=en_pos, label=unlist(strsplit(myaa, "")))
#case 2 - gaps in between groups of 3 letters, and at the beginning of groups of 3 letters
myseq <- "CTACGTAGCTAGCTGGGGTACCGT---TAT--TCAGCTAGCATG"
st_pos <- c(1,4,7,10,13,16,19,22,28,33,36,39,42)
en_pos <- c(3,6,9,12,15,18,21,24,30,35,38,41,44)
mydf <- data.frame(starts=st_pos, ends=en_pos, label=unlist(strsplit(myaa, "")))
Como devo produzir os vetores st_pos
e en_pos
nesses casos de uma maneira fácil?
EDITAR
Para obter esses números, eu apenas divido as sequências em grupos de 3 letras e conto as posições manualmente, mas não sei como fazer isso de forma automática.
Para posições iniciais de sequência do caso 1:
1 4 7 10 13 16 19 22 25 31 36 39 42
CTA CGT AGC TAG CTG GGG TAC CGT T---AT TC--A GCT AGC ATG
Da mesma forma para as posições finais do caso 1:
3 6 9 12 15 18 21 24 30 35 38 41 44
CTA CGT AGC TAG CTG GGG TAC CGT T---AT TC--A GCT AGC ATG
Agora para as posições iniciais da sequência do caso 2:
1 4 7 10 13 16 19 22 28 33 36 39 42
CTA CGT AGC TAG CTG GGG TAC CGT --- TAT -- TCA GCT AGC ATG
E caso 2 posições finais:
3 6 9 12 15 18 21 24 30 35 38 41 44
CTA CGT AGC TAG CTG GGG TAC CGT --- TAT -- TCA GCT AGC ATG
Você pode tentar algo assim:
Experimente o seguinte, que identifica o índice de qualquer letra maiúscula na sequência usando
grep
e, em seguida, cria as posições inicial e final a partir disso.Dá:
que corresponde à saída esperada.
Caso #2
Dá
O que também corresponde ao resultado esperado.