I ' m с помощью Perl для создания списка уникальных экзонов (которые являются единицами генов).
Я создал файл в этом формате (с сотнями тысяч строк):
chr1 1000 2000 gene1
chr1 3000 4000 gene2
chr1 5000 6000 gene3
chr1 1000 2000 gene4
Позиция 1 - хромосома, позиция 2 - начальная координата экзона, позиция 3 - конечная координата экзона, а позиция 4 это имя гена.
Поскольку гены часто состоят из разного расположения экзонов, у вас есть один и тот же экзон в нескольких генах (см. Первый и четвертый наборы). Я хочу удалить эти «дубликаты», то есть удалить ген1 или ген4 (не важно, какой из них будет удален).
Я часами бился головой о стену, пытаясь сделать то, что (как мне кажется) является простой задачей . Может ли кто-нибудь указать мне в правильном направлении? Я знаю, что люди часто используют хеши для удаления повторяющихся элементов, но это не совсем дубликаты (поскольку имена генов разные). Также важно не потерять имя гена. В противном случае это было бы проще.
Вот полностью нефункциональный цикл, который я пробовал. В массиве «экзонов» каждая строка хранится как скаляр, отсюда и подпрограмма. Не смейся. Я знаю, что это не работает, но, по крайней мере, вы видите (я надеюсь), что я пытаюсь сделать:
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
}
}
}
}