亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 交叉比對(duì),取最大的,求思路或者程序。 [打印本頁(yè)]

作者: 54red    時(shí)間: 2015-09-01 11:30
標(biāo)題: 交叉比對(duì),取最大的,求思路或者程序。
有兩個(gè)輸入 :

file1:::::gene_list.txt
PEX19
NDUFS2

file2:::::NM.txt
NM_015840        ADAR        15        3603
NM_001111        ADAR        15        3681
NM_001193495        ADAR        14        2796
NM_001025107        ADAR        14        2796
NM_002857        PEX19        8        900
NR_036493        PEX19        1        2
NR_036492        PEX19        1        2
NM_001193644        PEX19        8        840
NM_004550        NDUFS2        14        1392
NM_001166159        NDUFS2        13        1374
NM_020435        GJC2        1        1320

NM中第二列(ADAR)在gene_list存在,比如PEX19有四個(gè)符合的,
NM_002857        PEX19        8        900
NR_036493        PEX19        1        2
NR_036492        PEX19        1        2
NM_001193644        PEX19        8        840
第三列取最大的,此處是8,有兩個(gè),取第四行最大的900,
print OUT NM_002857        PEX19        8        900;

我正在寫(xiě)程序,但是寫(xiě)的好復(fù)雜,請(qǐng)問(wèn)各位大神,能提示一下么!
作者: xiumu2280    時(shí)間: 2015-09-01 12:11
本帖最后由 xiumu2280 于 2015-09-01 12:16 編輯

簡(jiǎn)單的寫(xiě)了一下,本質(zhì)應(yīng)該是個(gè)排序問(wèn)題,用了引用

這樣的寫(xiě)法應(yīng)該可以找到每個(gè)基因?qū)?yīng)的數(shù)值最大條目

后續(xù)還需要你自己更改一下
  1. use strict;
  2. use warnings;
  3. use Data::Dumper;
  4. use File::Basename;


  5. my %hash;

  6. while (<DATA>) {
  7.         chomp;
  8.         my @data = split /\s+/,my $line = $_;
  9.         if ($hash{$data[1]}) {
  10.                 if (($data[2] == $hash{$data[1]}->[2] && $data[3] > $hash{$data[1]}->[3]) || $data[2] > $hash{$data[1]}->[2]) {
  11.                         $hash{$data[1]} = \@data;
  12.                 }
  13.         }else{
  14.                 $hash{$data[1]} = \@data;
  15.         }
  16.        
  17. }


  18. print Dumper \%hash;


  19. __DATA__
  20. NM_015840        ADAR        15        3603
  21. NM_001111        ADAR        15        3681
  22. NM_001193495        ADAR        14        2796
  23. NM_001025107        ADAR        14        2796
  24. NM_002857        PEX19        8        900
  25. NR_036493        PEX19        1        2
  26. NR_036492        PEX19        1        2
  27. NM_001193644        PEX19        8        840
  28. NM_004550        NDUFS2        14        1392
  29. NM_001166159        NDUFS2        13        1374
  30. NM_020435        GJC2        1        1320
復(fù)制代碼

作者: MMMIX    時(shí)間: 2015-09-01 12:30
回復(fù) 1# 54red


    把你的代碼貼上來(lái)看看

作者: jason680    時(shí)間: 2015-09-01 12:54
回復(fù) 1# 54red

>>...求思路

先讀取file2,第二列當(dāng)key,保存最大值,就好了...

第一筆,沒(méi)有key資料(新資料),直接(最大值)保存
NM_015840        ADAR        15        3603
key: ADAR   
$gene{'ADAR'} = [( NM_015840        ADAR        15        3603 )]   # 思路,非程序代碼

下一筆,先比第三列,再比第四列
NM_015840        ADAR        15      3683
key: ADAR   
$gene{'ADAR'} = [( NM_015840        ADAR        15        3683 )]   # 思路,非程序代碼
保存最大值


再讀取file1,依key值讀取(最大值)
$gene{'PEX19'} <--- 保存最大值
作者: 54red    時(shí)間: 2015-09-01 13:12
十分謝謝!我一直在看你的代碼學(xué)習(xí)perl,可是引用這塊始終沒(méi)學(xué)好,再次謝謝!回復(fù) 2# xiumu2280


   
作者: 54red    時(shí)間: 2015-09-01 13:15
謝謝jason680大神的思路,還把關(guān)鍵的引用怎么寫(xiě)都給我寫(xiě)好了 ^^回復(fù) 4# jason680


   
作者: ba_du_co    時(shí)間: 2015-09-01 14:54

  1. my @genelist = qw/PEX19 NDUFS2/;
  2. my %gene = map { $_, 1 } @genelist;
  3. my %nm;

  4. while (<DATA>) {
  5.     my ( undef, $key, $v1, $v2 ) = split;
  6.     next unless $gene{$key};

  7.     if ( exists $nm{$key} ) {
  8.         next if $v1 < $nm{$key}[0];

  9.         if ( $v1 > $nm{$key}[0] or $v2 > $nm{$key}[1] ) {
  10.             $nm{$key} = [ $v1, $v2, $_ ];
  11.         }
  12.     }
  13.     else {
  14.         $nm{$key} = [ $v1, $v2, $_ ];
  15.     }
  16. }

  17. print $_->[2] for values %nm;

  18. __DATA__
  19. NM_015840        ADAR        15        3603
  20. NM_001111        ADAR        15        3681
  21. NM_001193495        ADAR        14        2796
  22. NM_001025107        ADAR        14        2796
  23. NM_002857        PEX19        8        900
  24. NR_036493        PEX19        1        2
  25. NR_036492        PEX19        1        2
  26. NM_001193644        PEX19        8        840
  27. NM_004550        NDUFS2        14        1392
  28. NM_001166159        NDUFS2        13        1374
  29. NM_020435        GJC2        1        1320
復(fù)制代碼

作者: 54red    時(shí)間: 2015-09-01 17:34
剛剛看見(jiàn)你的程序,謝謝啦!今天下班了,明天再仔細(xì)看看 ~回復(fù) 7# ba_du_co


   
作者: sunzhiguolu    時(shí)間: 2016-03-08 01:45
其實(shí)你的問(wèn)題在于不要將解決問(wèn)題的思路放在細(xì)節(jié), 從整體看待這個(gè)問(wèn)題就相對(duì)好解決一些.
作者: RE_HASH    時(shí)間: 2016-03-09 00:56
my @genelist = qw/PEX19 NDUFS2/;
my %gene = map { $_, 1 } @genelist;

while (<DATA>) {
    my ( undef, $key, $v1, $v2 ) = split;
    next unless $gene{$key};
    $OUT->{$key}->{$v1 * 1000000 + $v2} = $_;
}
map {
  print $OUT->{$_}->{(sort {$b<=>$a} keys %{$OUT->{$_}})[0]} ;
}sort keys %$OUT;

__DATA__
NM_015840        ADAR        15        3603
NM_001111        ADAR        15        3681
NM_001193495        ADAR        14        2796
NM_001025107        ADAR        14        2796
NM_002857        PEX19        8        900
NR_036493        PEX19        1        2
NR_036492        PEX19        1        2
NM_001193644        PEX19        8        840
NM_004550        NDUFS2        14        1392
NM_001166159        NDUFS2        13        1374
NM_020435        GJC2        1        1320


$> perl test.pl
NM_004550        NDUFS2        14        1392
NM_002857        PEX19        8        900





歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2