2

0,1PCA、GWASなどの統計的なダウンストリーム分析を実行するために、MedLineファイルをテーブルとして解析しようとしています.Bio.Medlineと呼ばれるPythonモジュールをいくつかの追加のシェルコマンドで使用してフォーマットしました。さて、続きがわかりません。

File 1, - 1 行に 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
4

2 に答える 2

2

Python と Pandas でこれを実行できます。

In [1]: df = pd.read_table("file", header=None, sep="\t", names=["A", "B","C","D"], index_col=0)
In [2]: df
Out[2]: 
          A                           B                              C  \
0  19801464        Animals Biodiversity  Computational Biology/methods   
1  19696045  Environmental Microbiology  Computational Biology/methods   

          D  
0       DNA  
1  Software  

In [3]: b = pd.get_dummies(df.B)

In [4]: c = pd.get_dummies(df.C)

In [5]: d = pd.get_dummies(df.D)

In [6]: presence_absence = b.merge(c, right_index=True, left_index=True).merge(d,right_index=True, left_index=True)

In [7]: presence_absence
Out[7]: 
          Animals Biodiversity  Environmental Microbiology  \
A                                                            
19801464                     1                           0   
19696045                     0                           1   

          Computational Biology/methods  DNA  Software  
A                                                       
19801464                              1    1         0  
19696045                              1    0         1

お役に立てれば

于 2014-07-16T08:51:30.227 に答える
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を参照してください。

于 2014-07-16T05:13:41.687 に答える