2013-05-20 2 views
-2

Я считаю, что мой вопрос еще не все понятен. Итак, время для другого подхода в объяснении моих квеста.Скользящее окно для определения локального адресата данных (AWK)

  • У меня есть один файл данных, содержащий около 27 500 точек данных. Каждый datapoint имеет уникальные целые числа от 0 до 46041637 в первом столбце и описание в столбце 2-6.
  • Я хотел бы знать, как целые числа распределяются по возможностям 46M. Например, сколько (и которые) datapoints попадает в диапазон 1-1000, сколько между 1001-2000 и так далее до 46M.
  • В предыдущем примере будут созданы меньшие наборы данных (или бункеров) размером около 46 тыс. (46 М/1000). Некоторые бункеры будут содержать несколько точек данных, в то время как многие из них не будут содержать каких-либо данных.
  • В приведенном выше примере размер/длина бункера (я бы назвал его windowsize) равным 1000. Я еще не знаю, какой лучший оконный код подходит для моих целей, поэтому я хотел бы иметь возможность сценарий, который имеет «настраиваемый» windowsize.
  • Кроме того, пример 1-1000, 1001, 2001, [...], очевидно, не показывает перекрытия в бункерах. Однако это означает, что я теряю много «чувствительности» и, следовательно, знания/информации. Поэтому я хотел бы иметь возможность создавать окна/корзины, которые перекрываются. Например, 1-1000,501-1500, 1501-2500, 2001-3000. Эти ячейки имеют перекрытие 500. Я бы мог установить количество перекрытий между бункерами.
  • Я хотел бы написать каждый bin в свой собственный файл, даже если bin не содержит каких-либо datapoints.

Вот объяснение, которое я дал раньше, что было не очень хорошо, по-видимому


Использование AWK Я пытаюсь «скользить окно» над списком целых чисел. Если бы я разделил этот набор данных, сколько точек данных было бы в каждом (возможно перекрывающемся) бине? Мне нравится устанавливать binsize (или windowsize) и перекрываться между бункерами. Такой подход позволяет мне получить представление о локальной плотности данных. -> У меня немного опыта AWK, и мне сказали, что AWK должен уметь выполнять эту работу, я предпочитаю использовать AWK. Тем не менее, я также открыт для других идей (например, Python).

  • У меня есть один файл данных, содержащий около 27 500 целых чисел от 0 до 46041637 (46 миллионов) и описание для каждой точки данных.
  • Как я хотел бы иметь представление об эффектах «изменения» разрешения, которое я хотел бы сыграть немного с разными размерами окон и перекрытием между отдельными окнами.
  • Мне нравится писать все содержимое каждого «окна» в отдельный файл и называть файл в соответствии с «начальной точкой Windows».

Я подготовил несколько примеров файлов, которые прилагаются ниже.Однако, чтобы сделать его легче получить идея вот еще очень и очень упрощенный пример:

Datarange 1 - 10 
Integers in dataset: 2,4,5,6,9 
#### 
####Example 1: Windowsize=5,overlap=2#### 
#### 
file name ="1" contents are: (range is 1 - 5) 
2 
4 
5 
file name="3" contents are: (range is 4 - 8, that is, two overlap with previous range) 
4 
5 
6 
file name="7" contents are: (range is 7 - 10, if the range was larger, it would be 7 - 11) 
9 
#### 
####Example 2: Windowsize=3,overlap=0#### 
#### 
file name="1" contents are (range 1 - 3) 
2 
file name="4" contents are (range 4 - 6) 
4 
5 
6 
file name="7" contents are (range 7 - 9) 
9 
file name="9" contents are (range 10 - 10) 
<none> 

Пример входного файла

3579      
    3661      
    3752 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1 
    3947 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1 
    6734 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    6865 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    6915 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    8961      
    13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1 
    22516     
    22556     
    36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1 
    37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1 
    167942 5P_UTR 167930 167956 - Solyc06g005140.2.1.0Solyc06g005140.2.1 
    168020 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1 
    168153 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1 

Пример выходного файла с различными windowsizes и перекрываться

> AWK -v windowsize=50000 -v overlap=0 -f awkscript input.file 
> ls 
1  50001 
100001 150001 
> cat 1 
    3579      
    3661           
    3752 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1 
    3947 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1 
    6734 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    6865 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    6915 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    8961      
    13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1 
    22516     
    22556     
    36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1 
    37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1     
    3752 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1 
    3947 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1 
    6734 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    6865 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    6915 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    8961      
    13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1 
    22516     
    22556     
    36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1 
    37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1 
> cat 50001 

> cat 100001 

> cat 150001 
    167942 5P_UTR 167930 167956 - Solyc06g005140.2.1.0Solyc06g005140.2.1 
    168020 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1 
    168153 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1 

> #And with some different paramenters 
> AWK -v windowsize=160000 -v overlap=10000 -f awkscript input.file 
> ls 
1 10001 
> cat 1 
    3579      
    3661      
    3752 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1 
    3947 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1 
    6734 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    6865 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    6915 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1 
    8961      
    13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1 
    22516     
    22556     
    36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1 
    37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1 
> cat 10001 
    13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1 
    22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1 
    22516     
    22556     
    36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1 
    37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1 
    37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1 
    167942 5P_UTR 167930 167956 - Solyc06g005140.2.1.0Solyc06g005140.2.1 
    168020 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1 
    168153 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1 

Большое вам спасибо за вашу помощь!


Небольшая корректировка моего первоначального вопроса, потому что для меня требуется больше вычислительного времени, чем я ожидал.

Возможно ли, что вместо записи всех записей, которые попадают в конкретное окно в свой собственный файл, записывают «статистику» каждого окна в строку в таблице? Со статистикой я имею в виду, сколько записей содержит конкретное окно и сколько из каждого типа. Применительно к примеру выше это будет выглядеть следующим образом:

> python script.py 160000 10000 file (using the script from sidharth c nadhan) 
> cat result 
window | total | exons | intron | 3P_UTR | 5P_UTR 
1  | 17 | 6 | 5 | 1 | 0 
10001 | 12 | 4 | 4 | 1 | 1 
+0

Изменил мой вопрос, надеюсь, теперь это более «понятно»? Пожалуйста, дайте мне знать! Большое спасибо вам всем! – Elmer

ответ

1

Попробуйте это:

import sys,os,collections 
list1,set1=list(),set() 
dict1 = collections.defaultdict(list) 
dict2 = collections.defaultdict(int) 
wind , overl, maxim= int(sys.argv[1]),int(sys.argv[2]),int(sys.argv[4]) 
for line in open(sys.argv[3]): 
    try : set1.add(line.split()[1]) 
    except : pass 
    for i in xrange(1,maxim,wind-overl): 
    if int(line.split()[0]) in xrange(i,wind+i): dict1[i].append(line) 
print "Window\tTotal\t", 
for entri in set1 : print entri,"\t", 
print "\n", 
for j in xrange(1,maxim,wind-overl): 
    dict2.clear() 
    for line in dict1[j]: 
    try : dict2[line.split()[1]] +=1 
    except: pass 
    print j,"\t",len(dict1[j]),"\t", 
    for entri in set1: 
    print dict2[entri],"\t", 
    print "\n", 

Использование: питон script.py окно файл перекрытия максима

Где изречение относится к величине целое во входном файле. maxim = 168153 в файле ввода образца. Предоставление его в качестве аргумента командной строки повышает вычислительную скорость.

+0

Удивительный! Большое спасибо, я попытался лучше выразить свой вопрос, мне трудно объяснить, но это хороший урок. Ваш скрипт работает прямо сейчас, с размером окна 1M и перекрытием 0. Однако он берет много мощности и времени процессора, поэтому я не могу дать вам никакой обратной связи, но, тем не менее, многое спасибо! – Elmer

+0

Я думаю, что это не работает так, как предполагалось, мой процессор работает на> 80 градусов C прямо сейчас, и есть нулевой вывод ... – Elmer

+0

Можете ли вы попробовать с небольшим образцом и сначала попробовать. http://ideone.com/8eyyBn Возможно, вы можете изменить это, чтобы соответствовать требованиям пользователя. –

 Смежные вопросы

  • Нет связанных вопросов^_^