我试图将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。