翻译核苷酸三联体

时间:2019-05-28 18:05:39

标签: r string split

我正在尝试以某种方式拆分一串核苷酸,以便让我能够找到核苷酸序列中心的离群值,并通过添加“ 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的倍数(因为它们是密码子),所有值除外。谢谢!!

2 个答案:

答案 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"