我试图将MedLine文件解析为0,1表,以进行一些下游统计分析:PCA,GWAS等。我使用名为Bio.Medline的Python模块以及一些其他shell命令对其进行了格式化。现在,我不知道如何继续。

我需要将File 1(一个每行一张纸和制表符分隔的关键字的键值文件)转换为一个包含折叠关键字并且关键字是否存在显示为1或0值的文件。

我想用Perl做到这一点,但是欢迎其他解决方案。

谢谢伯纳多

File 1

19801464    Animals Biodiversity    Computational Biology/methods   DNA
19696045    Environmental Microbiology  Computational Biology/methods   Software


所需的输出:

    Animals Biodiversity    Computational Biology/methods   DNA Environmental Microbiology  Software
19801464    1   1   1   0   0
19696045    0   1   0   1   1

最佳答案

perl脚本将构建您应该能够使用的哈希。为了方便起见,我将List::MoreUtils用于uniq,将Data::Printer用于转储数据结构:

#!/usr/bin/env perl
use strict;
use warnings;
use List::MoreUtils qw(uniq);
use DDP;

my %paper ;
my @categories;

while (<DATA>){
  chomp;
  my @record = split /\t/ ;
  $paper{$record[0]}  = { map { $_ => 1 } @record[1..$#record] } ;
  push @categories , @record[1..$#record] ;
}

@categories = uniq @categories;

foreach (keys %paper) {
  foreach my $category(@categories) {
    $paper{$_}{$category} //= 0 ;
  }
};

p %paper ;

__DATA__
19801464   Animals Biodiversity  Computational Biology/methods  DNA
19696045   Environmental Microbiology   Computational Biology/methods Software


输出量

{
    19696045   {
        'Animals Biodiversity'            0,
        'Computational Biology/methods'   1,
        DNA                               0,
        'Environmental Microbiology'      1,
        Software                          1
    },
    19801464   {
        'Animals Biodiversity'            1,
        'Computational Biology/methods'   1,
        DNA                               1,
        'Environmental Microbiology'      0,
        Software                          0
    }
}


从那里开始生成所需的输出,可能需要printf正确设置行的格式。以下内容可能足以满足您的目的:

print "\t", (join "  ", @categories);
for (keys %paper) {
  print "\n", $_, "\t\t" ;
  for my $category(@categories) {
    print $paper{$_}{$category}," "x17 ;
  }
}




编辑

格式化输出的几种方法...(我们使用x将格式部分乘以@categories数组中元素的长度或元素数,以便它们匹配):

使用format

my $format_line = 'format STDOUT =' ."\n"
                . '@# 'x ~~@categories . "\n"
                . 'values %{ $paper{$num} }' . "\n"
                . '.'."\n";
for $num (keys %paper) {
  print $num ;
  no warnings 'redefine';
  eval $format_line;
write;
}


使用printf

print (" "x9, join "  ", @categories, "\n");
for $num (keys %paper) {
  print $num  ;
  map{ printf "%19d", $_ }  values %{ $paper{$num} } ;
  print "\n";
}


使用form

use Perl6::Form;
for $num (keys %paper) {
  print form
  "{<<<<<<<<}" . "{>}" x ~~@categories ,
    $num       , values %{ $paper{$num} }
}




根据您打算处理数据的方式,您也许可以在perl中完成其余的分析,因此直到在工作流程的后续阶段,打印的精确格式可能才是优先事项。有关想法,请参见BioPerl

10-07 19:28
查看更多