Страницы: 1
RSS
Транслировать нуклеотидную последовательность в соответствующую ей аминокислотную последовательность
 
Друзья, помогите пожалуйста написать функцию (скорее чем формулу). Хотелось бы транслировать нуклеотидную последовательность в соответствующую ей аминокислотную последовательность. Файл с примером прикрепляю. В ячейки B2 написана нуклеотидная последовательность, нужно чтобы в ячейки С2 была аминокислотная. Триплетный код прилагаю.
 
Цитата
нужно чтобы в ячейки С2 была аминокислотная.
Ну да, здесь все сплошь химики и всем все понятно...
 
Цитата
vikttur написал:
Ну да, здесь все сплошь химики и всем все понятно...
ну один то точно есть. Теееезкааааа!!!!!

Правильно ли понимать, что просто все тройки символов заменяются на один согласно таблице.  Сразу уточните версию Excel? на образцах последни х можно формулу прикрутить, а на так функция UDF  На VBA
Изменено: БМВ - 25.05.2020 12:28:30
По вопросам из тем форума, личку не читаю.
 
Да он занят производством горючей жидкости.

Что надо? Подставить в текст вместо триад буквенное значение из таблицы?
 
Цитата
vikttur написал:
горбчей жидкости
Это спинномозговая ???  :D
По вопросам из тем форума, личку не читаю.
 
Спиногрызная. Да исправил уже )
 
Простите, 20 лет на эти четыре буквы смотрю даже не подумал что может быть не понятно. Ну да, просто тройки заменить на буквенные значения, например: GCT на A, TGC на С, GAC на D и т.д. При этом в одной ячейки написано GCTTGCGAC а в сосоедней трансляция должна быть ACD. Стоп-кодоны можно проигнорировать.

Microsoft Office профессиональный плюс 2016, версия 2005 (сборка 12827.20210).
Изменено: dim284 - 25.05.2020 12:51:17
 
Цитата
Стоп-кодоны можно проигнорировать
Да запросто. Я их каждый день игнорирую. Пачками. Иногда мухобойкой достаю, если надоедают :)
 
Код
Function strAmino(strNukle As String) As String
Dim i As Integer, rez As String
For i = 1 To Len(strNukle) Step 3
    Select Case Mid(strNukle, i, 3)
        Case "GCA", "GCC", "GCG", "GCT": rez = rez & "A"
        Case "TGC", "TGT": rez = rez & "C"
        Case "GAC", "GAT": rez = rez & "D"
        Case "GAA", "GAG": rez = rez & "E"
        Case "TTC", "TTT": rez = rez & "F"
        Case "GGA", "GGC", "GGG", "GGT": rez = rez & "G"
        Case "CAC", "CAT": rez = rez & "H"
        Case "ATA", "ATC", "ATT": rez = rez & "I"
        Case "AAA", "AAG": rez = rez & "K"
        Case "CTA", "CTC", "CTG", "CTT", "TTA", "TTG": rez = rez & "L"
        Case "ATG": rez = rez & "M"
        Case "AAC", "AAT": rez = rez & "N"
        Case "CCA", "CCC", "CCG", "CCT": rez = rez & "P"
        Case "CAA", "CAG": rez = rez & "Q"
        Case "AGA", "AGG", "CGA", "CGC", "CGG", "CGT": rez = rez & "R"
        Case "AGC", "AGT", "TCA", "TCC", "TCG", "TCT": rez = rez & "S"
        Case "ACA", "ACC", "ACG", "ACT": rez = rez & "T"
        Case "GTA", "GTC", "GTG", "GTT": rez = rez & "V"
        Case "TGG": rez = rez & "W"
        Case "TAC", "TAT": rez = rez & "Y"
        Case "TAA", "TAG", "TGA": rez = rez & "Stop"
    End Select
 Next i
strAmino = rez
End Function
По вопросам из тем форума, личку не читаю.
 
Вариант на Power Query:
Код
let
    ListForReplace = Table.ToRows( Excel.CurrentWorkbook(){[Name="Справочник"]}[Content] ),
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content][[Нуклеотидная последовательность]],
    AddedCustom = Table.AddColumn(
        Source, 
        "Аминокислотная последовательность", each 
        Text.Combine( List.ReplaceMatchingItems( Splitter.SplitTextByRepeatedLengths(3)([Нуклеотидная последовательность]), ListForReplace) ), 
        type text )
in
    AddedCustom

В левый столбец зеленой таблицы вставляете нуклеотидные последовательности, потом жмете правой кнопкой по таблице и выбираете пункт "Обновить", в правом столбце получаете искомое.
Справочник с заменами можете вырезать вставить в любом месте файла, если он там мешает, главное чтобы он оставался в виде умной таблицы и у таблицы не поменялось имя.
Изменено: PooHkrd - 25.05.2020 13:12:36
Вот горшок пустой, он предмет простой...
 
Огромное всем спасибо, особенно БМV и PooHkrd! Все же буду пользоваться функцией, работает на ура и нет лишних значений на странице. Вариант на Power Query обещаю освоить, может где пригодиться. Я рад до безумия, еще раз большое спасибо!
 
Цитата
dim284 написал:
нет лишних значений на странице
Тоже мне проблема. Так бы сразу и сказали, вот:
Код
let
    ListForReplace = 
       {{"GCA","A"},{"GCC","A"},{"GCG","A"},{"GCT","A"},
        {"TGC","C"},{"TGT","C"},
        {"GAC","D"},{"GAT","D"},
        {"GAA","E"},{"GAG","E"},
        {"TTC","F"},{"TTT","F"},
        {"GGA","G"},{"GGC","G"},{"GGG","G"},{"GGT","G"},
        {"CAC","H"},{"CAT","H"},
        {"ATA","I"},{"ATC","I"},{"ATT","I"},
        {"AAA","K"},{"AAG","K"},
        {"CTA","L"},{"CTC","L"},{"CTG","L"},{"CTT","L"},{"TTA","L"},{"TTG","L"},
        {"ATG","M"},
        {"AAC","N"},{"AAT","N"},
        {"CCA","P"},{"CCC","P"},{"CCG","P"},{"CCT","P"},
        {"CAA","Q"},{"CAG","Q"},
        {"AGA","R"},{"AGG","R"},{"CGA","R"},{"CGC","R"},{"CGG","R"},{"CGT","R"},
        {"AGC","S"},{"AGT","S"},{"TCA","S"},{"TCC","S"},{"TCG","S"},{"TCT","S"},
        {"ACA","T"},{"ACC","T"},{"ACG","T"},{"ACT","T"},
        {"GTA","V"},{"GTC","V"},{"GTG","V"},{"GTT","V"},
        {"TGG","W"},
        {"TAC","Y"},{"TAT","Y"},
        {"TAA","Stop"},{"TAG","Stop"},{"TGA","Stop"}},
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content][[Нуклеотидная последовательность]],
    AddedCustom = Table.AddColumn(
        Source, 
        "Аминокислотная последовательность", each 
        Text.Combine( List.ReplaceMatchingItems( Splitter.SplitTextByRepeatedLengths(3)([Нуклеотидная последовательность]), ListForReplace) ), 
        type text )
in
    AddedCustom
Вот горшок пустой, он предмет простой...
 
Тёзка был занят; жидкость не горючая, а дезинфицирующая - кстати откуда инфа, большой брат следит за мной? )))
Напоминаю, что многие аминокислоты кодируются первыми двумя нуклеотидами триплета, посему вариант (быстродействие не сравнивал, не до этого)
Скрытый текст

Цитата
dim284 написал:
Стоп-кодоны можно проигнорировать
только очень жестокие люди игнорируют "детский плач"
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
большой брат следит за мной?
Ну, тогда уж ма-а-аленький  :D
Вот горшок пустой, он предмет простой...
 
Цитата
buchlotnik написал:
быстродействие не сравнивал, не до этого
конечно не до этого  жидкость дезинфицирующая улетучивается :-)

Кстати интерсно сравнить, по шагам сравнения больше, но ведь и доп. операций  тоже.

upd. шаги решают все. не на много вариант в лоб четь уступает, на 20000 строках набегает 2-3 секунды
39,40234375
42,23828125
38,6015625
41,796875
Изменено: БМВ - 25.05.2020 15:25:26
По вопросам из тем форума, личку не читаю.
 
На 10000 строк (брал строку из примера)получил в среднем:
strAmino - 9,6 сек
CodonToAmino - 8,4 сек

Но 5% всё-таки выиграл, так что зря вы так, пары жидкости способствуют )))
Изменено: buchlotnik - 25.05.2020 15:36:02
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
Но 10% всё-таки выиграл
Вариант PQ на 10к строк моем компе выдал 6.7 сек
Функции отработали
strAmino - 21,9 сек
CodonToAmino - 20,5 сек
первый раз вижу, чтобы PQ был быстрее, все таки List.ReplaceMatchingItems это сила. Но тут понятно, что просто алгоритмы разные, наверняка, VBA можно ускорить. Может Алексей со своих смет переключится. Он любит всякое такое оптимизировать.  :)
Изменено: PooHkrd - 25.05.2020 15:46:21
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
наверняка, VBA можно ускорить
ну да, например, словарь подгрузить один раз на все итерации, но как уже сказал выше - не до этого, жидкость улетает (7 молекулярных слоёв в секунду)
Соблюдение правил форума не освобождает от модераторского произвола
 
PooHkrd, думаю тут выигрывает не метод , а проигрывает UDF вызванная с листа.
По вопросам из тем форума, личку не читаю.
 
а ну кстати - если массив забрать в память и там крутить наверняка шустрее выйдет
Соблюдение правил форума не освобождает от модераторского произвола
 
Михаил, я проверил, шустрее но не на столько чтоб существенно.
По вопросам из тем форума, личку не читаю.
 
Я хочу проверить вариант на словаре - до дома доехать надо, т.е. сделали словарь, собрали ячейки в память и за раз прогнали с выгрузкой ресайзом
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал: до дома доехать надо
Только не за рулем, а то по дороге химики с трубочками пристанут )
 
Не быстрее.
Скрытый текст

Код
Sub test2()
Dim t As Double

t = Timer
arr = Лист1.Range("b3:b20000")
For i = 1 To UBound(arr, 1)
    arr(i, 1) = strAmino(arr(i, 1))
Next
Лист1.Range("c3:c20000") = arr
Debug.Print Timer - t
t = Timer
arr = Лист1.Range("b3:b20000")
For i = 1 To UBound(arr, 1)
    arr(i, 1) = strAmin2(arr(i, 1))
Next
Лист1.Range("c3:c20000") = arr
Debug.Print Timer - t
t = Timer
arr = Лист1.Range("b3:b20000")
For i = 1 To UBound(arr, 1)
    arr(i, 1) = CodonToAmino$(arr(i, 1))
Next
Лист1.Range("c3:c20000") = arr
Debug.Print Timer - t
End Sub


40,890625
39,1484375
39,890625
Изменено: БМВ - 25.05.2020 19:04:05
По вопросам из тем форума, личку не читаю.
 
Я имел ввиду иное:
Скрытый текст
на 20k вышло:
strAmino - 43,56251
CodonToAmino - 29,16406
test2 - 19,32813

PQ при этом отработал за 5,391...
Изменено: buchlotnik - 25.05.2020 20:06:04
Соблюдение правил форума не освобождает от модераторского произвола
Страницы: 1
Наверх