2012-07-03 2 views
1

У меня есть набор данных, который выглядит как этотбиннинговых данные

-9030 KIR3DX1 
-75  SLC12A6 
8005 C14orf79 
-251 ARAP1 
65994 EFNB1 
-12111 SLC7A5 
-11643 CAMK2G 
-19749 PRPS2 
-23324 MIR198 
10012 LOC100506172 
-77  CCDC88A 
12171 MMP14 

где колонка 1 представляет расстояние (в парах оснований) элементов (генов) в колонке 2 от 0 в любом направлении. Я хочу записать эти данные в окно из 50 базовых пар.

Любые предложения? Спасибо

+2

Что вы имеете в виду под «биннинга» данные? Я знаю, что это значит для гистограммы, я не вижу, как применить ее к этим данным. –

+0

точно, я хочу, чтобы это отношение с гистограммой. Во-вторых, это лишь малая часть моих исходных данных. – Angelo

ответ

1

Довольно просто один лайнер:

perl -MPOSIX=floor -anE'[email protected]{$f{floor($F[0]/50)}},$F[1]}{$,=" ";for(sort{$a<=>$b}keys%f){$i=$_*50;say"$i -",$i+49,": @{$f{$_}}"}' 

ПримечаниеЭтот один вкладыш обеспечивает правильный выход для данных тестирования (смотрите на -23324 MIR198, который, безусловно, в -23350 - -23301, например):

-23350 - -23301 : MIR198 
-19750 - -19701 : PRPS2 
-12150 - -12101 : SLC7A5 
-11650 - -11601 : CAMK2G 
-9050 - -9001 : KIR3DX1 
-300 - -251 : ARAP1 
-100 - -51 : SLC12A6 CCDC88A 
8000 - 8049 : C14orf79 
10000 - 10049 : LOC100506172 
12150 - 12199 : MMP14 
65950 - 65999 : EFNB1 
0
s=''' 
-9030 KIR3DX1 
-75  SLC12A6 
8005 C14orf79 
-251 ARAP1 
65994 EFNB1 
-12111 SLC7A5 
-11643 CAMK2G 
-19749 PRPS2 
-23324 MIR198 
10012 LOC100506172 
-77  CCDC88A 
12171 MMP14 
''' 

import re 
from collections import defaultdict 

bin = defaultdict(list) 
for distance, gene in re.findall('^(\S+)\s+(\S+)',s,re.M): 
    bin[int(distance)//50].append(gene) 

print(bin) 
0

это работает?

from collections import defaultdict 

binner=defaultdict(list) 
with open(datafilename) as f: 
    for line in f: 
     i=int(line.split()[0]) 
     binner[i//50].append(line) 

Я просто биннинга всю линию, так как я не знаю, какую информацию вы на самом деле хотите, чтобы там (это немного непонятно с набором данных, что грязный) ...

0

Я буду предположим, что вы хотите гену имена Binned расстоянием в парах оснований:

from collections import defaultdict, Counter 

bins = defaultdict(Counter) 
binsize = 50 

with open(datafile) as inf: 
    for line in inf: 
     data = line.split('<', 1)[0] 
     offset, name = data.split() 
     bins[int(offset)//binsize][name] += 1 

затем

keys = sorted(bins) 
for key in keys: 
    values = ', '.join('{1} {0}'.format(a,b) for a,b in bins[key].most_common()) 
    print('{:>7} - {:>7} : {}'.format(binsize*key, binsize*(key+1)-1, values)) 

на ваши результаты выборки данных в

-23350 - -23301 : 1 MIR198 
-19750 - -19701 : 1 PRPS2 
-12150 - -12101 : 1 SLC7A5 
-11650 - -11601 : 1 CAMK2G 
    -9050 - -9001 : 1 KIR3DX1 
    -300 - -251 : 1 ARAP1 
    -100 -  -51 : 1 CCDC88A, 1 SLC12A6 
    8000 - 8049 : 1 C14orf79 
    10000 - 10049 : 1 LOC100506172 
    12150 - 12199 : 1 MMP14 
    65950 - 65999 : 1 EFNB1 
+0

FWIW Я подозреваю, что '
' не находятся в исходном наборе данных, и поскольку между последним геном иногда нет разрыва, а '<', '.split()' не будет работать. – DSM

+0

@DSM: ах. Хороший момент, я этого не заметил. –

2

Программа (надеюсь, OK в Perl):

#!/usr/bin/perl 

# Create a histogram of some data 

# Denis Howe 2012-07-03 - 2012-07-03 18:40 

use strict; 
use warnings; 

# my $n_bins = 10; 
my $width = 50; 

# Read lines into @d 
my @d = <DATA>; chomp @d; 

# Split each line containing a digit into a pair 
@d = map [split(/\s+/, $_)], grep /\d/, @d; 

# Find range 
my $min = 9E9; my $max = -9E9; 
foreach (@d) 
{ 
    $min = $_->[0] if ($_->[0] < $min); 
    $max = $_->[0] if ($_->[0] > $max); 
} 

# Round down to multiple of $width 
$min = int($min/$width) * $width; 

# Ensure there's a bin for max value 
# my $width = ($max*1.01 - $min)/$n_bins; 
my $n_bins = int(($max - $min)/$width) + 1; 

# Allocate data to bins 
my @bin; 
foreach (@d) 
{ 
    push @{$bin[($_->[0]-$min)/$width]}, $_; 
} 

# Show content of each bin 
foreach (0 .. $n_bins-1) 
{ 
    next unless ($bin[$_]);    # Ignore empty bins 
    printf "%6d - %6d", $min + $_*$width, $min + ($_+1)*$width; 
    print map(" " . $_->[0] . ":" . $_->[1], @{$bin[$_]}), "\n"; 
} 

__DATA__ 
-9030 KIR3DX1 
-75  SLC12A6 
8005 C14orf79 
-251 ARAP1 
65994 EFNB1 
-12111 SLC7A5 
-11643 CAMK2G 
-19749 PRPS2 
-23324 MIR198 
10012 LOC100506172 
-77  CCDC88A 
12171 MMP14 
EOF 

Выход:

-23300 - -23250 -23324:MIR198 
-19750 - -19700 -19749:PRPS2 
-12150 - -12100 -12111:SLC7A5 
-11650 - -11600 -11643:CAMK2G 
-9050 - -9000 -9030:KIR3DX1 
    -300 - -250 -251:ARAP1 
    -100 - -50 -75:SLC12A6 -77:CCDC88A 
    8000 - 8050 8005:C14orf79 
10000 - 10050 10012:LOC100506172 
12150 - 12200 12171:MMP14 
65950 - 66000 65994:EFNB1 

HtH

+0

Спасибо Денису, я проверю код и приму свой ответ. :) – Angelo

+0

-23324: MIR198 не находится в -23300 - -23250 bin –