R语言 翻译核苷酸三联体



我正在尝试拆分一串核苷酸,以便我找到核苷酸序列中心的异常值,并通过添加"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 的倍数(因为它们是密码子),除了异常值之外的所有组。谢谢!!

也可以使用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"

你可以写一个简单的函数来做到这一点 - 也许像下面这样......

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"

这将被矢量化,因此您可以将其直接应用于字符串向量。

最新更新