我正在尝试以某种方式拆分一串核苷酸,以便让我能够找到核苷酸序列中心的离群值,并通过添加“ n”来填补空白,将其变成三元组。
我尝试按字符数进行拆分,但是问题是它从左到右发生,并且我一直在尝试找到一种从右到左的方法。因此,我要做的是找到序列的长度,在这个示例中为52。然后,我将该长度数除以3,以找到可能的三元组数。然后,我用2除以知道(显然是四舍五入)离群值的每一侧大约有3个小组。理想情况下,我希望左侧的三联体多于右侧的三联体。离群值将保留在中间(作为一个或两个核苷酸)。例如:
nucleobases <- 'TGTGCCAGCAGTTTAAGGTAGATAGCGGGATTCCTACAATGAGCAGTTCTTC'
nucleolength <- nchar("TGTGCCAGCAGTTTAAGGTAGATAGCGGGATTCCTACAATGAGCAGTTCTTC")
num1 <- round(nucleolength/6)*3
firstsplit <- gsub("(.{27})", "\\1 ", nucleobases) #This works for the first half
secondsplit <- gsub("(.{24})", "\\1 ", firstsplit, rev) #This works, but not in the ideal way that it is supposed to.
我将序列翻译成氨基酸没有任何麻烦,这是我的最终目标。我要在序列中(离群值)所在的位置添加“ n”,以便序列的末端成为正确的氨基酸。最终,这就是我想要的:
#original sequence: TGTGCCAGCAGTTTAAGGTAGATAGCGGGATTCCTACAATGAGCAGTTCTTC
#split up in the correct places: TGTGCCAGCAGTTTAAGGTAGATAGCG G GATTCCTACAATGAGCAGTTCTTC
#"N" fills in the outlier: TGTGCCAGCAGTTTAAGGTAGATAGCG GNN GATTCCTACAATGAGCAGTTCTTC
#Gaps are then eliminated and sequence is translated: TGTGCCAGCAGTTTAAGGTAGATAGCGGNNGATTCCTACAATGAGCAGTTCTTC
#Translated sequence: CASSLR-IAXDSYNEQFF
如果有人对如何以有效的方式做到这一点有所了解,那就太好了!另外,要记住的是,这不是唯一的顺序。还有其他具有不同长度的序列(47、46、35等)。重申一下,左侧的分组序列应长于右侧,离群值在中间。请记住,这些组应该是3的倍数(因为它们是密码子),所有值除外。谢谢!!
答案 0 :(得分:1)
您可以编写一个简单的函数来执行此操作-也许类似于以下内容...
nucleobases <- 'TGTGCCAGCAGTTTAAGGTAGATAGCGGGATTCCTACAATGAGCAGTTCTTC'
fill_outlier <- function(x){
threes <- floor(nchar(x) / 3) #number of whole sets of three
outlier <- 1 + 3 * ceiling(threes / 2) #number of threes to the left
outlen <- nchar(x) %% 3 #length of outlier
filled <- paste0(substr(x, 1, outlier-1), #section before outlier
ifelse(outlen==0, "", #do nothing if multiple of 3
substr(paste0(substr(x, outlier, outlier + outlen - 1), #outlier
"NN"), #pad it with Ns
1, 3)), #take first three characters
substr(x, outlier + outlen, nchar(x))) #section after outlier
return(filled)
}
fill_outlier(nucleobases)
[1] "TGTGCCAGCAGTTTAAGGTAGATAGCGGNNGATTCCTACAATGAGCAGTTCTTC"
这将被矢量化,因此您可以将其直接应用于字符串矢量。
答案 1 :(得分:1)
也可以使用sub
:
dna <- 'TGTGCCAGCAGTTTAAGGTAGATAGCGGGATTCCTACAATGAGCAGTTCTTC'
fillorf <- function(dna){
nout <- nchar(dna) %% 3
if(nout){
nleft <- (nchar(dna) %/% 6 + 1) * 3 + nout
dna <- sub(
paste('(^.{', nleft, '})(.+$)', sep = ''),
paste('\\1', substr('NN', 1, 3 - nout), '\\2', sep = ''),
dna
)
}
return(dna)
}
# > fillorf(dna)
# [1] "TGTGCCAGCAGTTTAAGGTAGATAGCGGNNGATTCCTACAATGAGCAGTTCTTC"