Я пытаюсь разбить строку нуклеотидов таким образом, чтобы найти выброс в центре последовательности нуклеотидов и превратить ее в триплет, добавив «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 (поскольку они являются кодонами), все, кроме выброса. Спасибо!!
Вы можете написать простую функцию для этого - возможно, что-то вроде следующего...
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"
Это будет векторизовано, поэтому вы можете применить его непосредственно к вектору строк.
Я добавил строку, чтобы убедиться, что она работает, если нет выбросов, поэтому все должно быть в порядке для всех возможных входных данных.
Также можно использовать 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"
Это прекрасно работает! Мне было интересно, что, если у меня есть текстовый файл последовательностей, и я хотел бы создать фрейм данных исходных последовательностей в одном столбце и новых последовательностей рядом с ним?
Рад, что это помогло. Не проблема масштабировать мой подход или подход Эндрю. Я бы добавил последовательности в список, чтобы использовать функцию с lapply: lapply(seq_list, fillorf)
.
Большое спасибо! Это работает для этой последовательности! Будет ли это работать для последовательности, в которой выбросу требуется только одна буква «N», чтобы завершить триплет? А также, если последовательность кратна 3 (по длине), то не нужны никакие "N".