假设我有一个myseq
如下所示的序列。这是一个 DNA 序列,因此每组 3 个字母组成伴随myaa
序列中的一个字母(氨基酸)。它的长度为 13aa。
我想创建一个mydf
数据框,其中包含每组 3 个字母的起始和终止位置myseq
。在下面没有间隙的基本示例中,我可以轻松地使用 做到这一点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, "")))
这将生成这个数据框,这正是我想要的:
> 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
但是,我遇到了一些myseq
包含间隙的真实数据示例。在这些情况下,我无法依赖它,seq()
因为我需要考虑起始位置和终止位置的间隙。
我该怎么做?下面我向您展示了 2 个案例以及我预期的mydf
数据框,我只是对其开始和结束位置进行了硬编码。
#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, "")))
在这些情况下我该如何轻松地生成st_pos
和向量?en_pos
编辑
为了获得这些数字,我只是将序列分成 3 个字母组并手动计算位置,但我不知道如何以自动方式完成此操作。
对于情况 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
对于情况 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
现在对于情况 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
情况 2 的结束位置:
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
您可以尝试这样的事情:
尝试以下操作,使用识别序列中任何大写字母的索引
grep
,然后从中创建起始和结束位置。给出:
这与你的预期输出相符。
案例 #2
给予
这也符合您预期的输出。