Я использую Perl для генерации списка уникальных экзонов (которые являются единицами генов).
Я создал файл в этом формате (с сотнями тысяч строк):
chr1 1000 2000 ген1
chr1 3000 4000 ген2
chr1 5000 6000 gene3
chr1 1000 2000 ген4
Позиция 1 - это хромосома, позиция 2 - начальная координата экзона, позиция 3 - конечная координата экзона, а позиция 4 - имя гена.
Поскольку гены часто строятся из разных расположений экзонов, у вас один и тот же экзон в нескольких генах (см. Первый и четвертый наборы). Я хочу удалить эти «дубликаты» - т.е. удалить gene1 или gene4 (не важно, какой из них удаляется).
Я часами бился головой о стену, пытаясь сделать то, что (я думаю) является простой задачей. Кто-нибудь может указать мне правильное направление (я)? Я знаю, что люди часто используют хеши для удаления дублирующих элементов, но это не совсем дубликаты (так как имена генов разные). Также важно, чтобы я не потерял имя гена. В противном случае это было бы проще.
Вот совершенно неработающий цикл, который я пробовал. В массиве «exons» каждая строка хранится в виде скаляра, отсюда и подпрограмма. Не смейся Я знаю, что это не работает, но, по крайней мере, вы можете видеть (я надеюсь), что я пытаюсь сделать:
for (my $i = 0; $i < scalar @exons; $i++) {
my @temp_line = line_splitter($exons[$i]); # runs subroutine turning scalar into array
for (my $j = 0; $j < scalar @exons_dup; $j++) {
my @inner_temp_line = line_splitter($exons_dup[$j]); # runs subroutine turning scalar into array
unless (($temp_line[1] == $inner_temp_line[1]) && # this loop ensures that the the loop
($temp_line[3] eq $inner_temp_line[3])) { # below skips the identical lines
if (($temp_line[1] == $inner_temp_line[1]) && # if the coordinates are the same
($temp_line[2] == $inner_temp_line[2])) { # between the comparisons
splice(@exons, $i, 1); # delete the first one
}
}
}
* *} Тысяча двадцать-один