У меня есть таблица, имеющая следующей структураPerl: поиск региона с наибольшей шириной из списка
gene transcript exon length
A NM_1 1 10
A NM_1 2 5
A NM_1 3 20
A NM_2 1 10
A NM_2 2 5
A NM_2 3 50
B NM_5 1 10
... ... ... ...
Поэтому в основном, таблица состоит из колонки с все человеческими генами. Второй столбец содержит имя расшифровки. Один и тот же ген может иметь несколько транскриптов. Третий столбец содержит номер эксона. Каждый ген состоит из нескольких экзонов. Четвертый столбец содержит длину каждого экзона.
Теперь я хочу, чтобы создать новую таблицу вида:
gene transcript length
A NM_2 65
B NM_5 10
... ... ...
Так что я в основном хочу сделать, это найти самый длинный транскрипт для каждого гена. Это означает, что когда для каждого гена (столбца) имеется несколько расшифровки стенограммы (транскрипт колонки), мне нужно сделать сумму значений в столбце длины для всех экзонов транскрипта этого гена.
Итак, в примере есть два транскрипта для гена A: NM_1 и NM_2. Каждый из них имеет три экзона. Сумма этих трех значений для NM_1 = 10 + 5 + 20 = 35, для NM_2 - 10 + 5 + 50 = 65. Таким образом, для гена A NM_2 является самой длинной транскрипцией, поэтому я хочу поместить ее в новую таблицу. Для гена B имеется только 1 транскрипт с одним экзоном длиной 10. Так что в новой таблице я просто хочу, чтобы длина этой транскрипта была сообщена.
Я работал с хэш раньше, так что я думал о хранении «ген» и «расшифровки» как два разных ключей:
#! /usr/bin/perl
use strict;
use warnings;
open(my $test,'<',"test.txt") || die ("Could not open file $!");
open(my $output, '+>', "output.txt") || die ("Can't write new file: $!");
# skip the header of $test # I know how to do this
my %hash =();
while(<$test>){
chomp;
my @cols = split(/\t/);
my $keyfield = $cols[0]; #gene name
my $keyfield2 = $cols[1]; # transcript name
push @{ $hash{$keyfield} }, $keyfield2;
...
В качестве подсказки - вы получите лучший ответ, если попытаетесь решить проблему самостоятельно. Я бы предложил начать, глядя на хеши. – Sobrique
Я раньше работал с хэшами, но не так сложным, как это. Будет ли мое предложение выше работать? – user1987607
Является ли ваш выходной 'length' полем суммой длин? Похоже на это. – Sobrique