Транслатация нуклеотидов триплетами - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь разбить строку нуклеотидов таким образом, чтобы я мог найти выброс в центре нуклеотидной последовательности и превратить его в триплет, добавив «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 ]

1 голос
/ 29 мая 2019

Также можно использовать 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"
1 голос
/ 28 мая 2019

Вы можете написать простую функцию для этого - возможно, что-то вроде следующего ...

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"

Это будет векторизовано, так что вы можете применить его непосредственно к вектору строк.

...