Трансляция триплетов нуклеотидов

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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"

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

Большое спасибо! Это работает для этой последовательности! Будет ли это работать для последовательности, в которой выбросу требуется только одна буква «N», чтобы завершить триплет? А также, если последовательность кратна 3 (по длине), то не нужны никакие "N".

Lasarus9 29.05.2019 20:14

Я добавил строку, чтобы убедиться, что она работает, если нет выбросов, поэтому все должно быть в порядке для всех возможных входных данных.

Andrew Gustar 29.05.2019 20:29
Ответ принят как подходящий

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

Это прекрасно работает! Мне было интересно, что, если у меня есть текстовый файл последовательностей, и я хотел бы создать фрейм данных исходных последовательностей в одном столбце и новых последовательностей рядом с ним?

Lasarus9 29.05.2019 20:28

Рад, что это помогло. Не проблема масштабировать мой подход или подход Эндрю. Я бы добавил последовательности в список, чтобы использовать функцию с lapply: lapply(seq_list, fillorf).

utubun 29.05.2019 20:34

Другие вопросы по теме