0

PCA (主成分分析) の準備を整えるために、2 列のファイルを 0 と 1 のテーブルに変換したいと考えています。入力ファイルは、最初の列の細菌名と 2 番目の列の細菌記述子で構成されます。

考えられる方法: 入力ファイルをハッシュに保存し、各列で何らかの「uniq」コマンドを実行して、それらを出力ファイルに追加します。最後に、出力ファイルの組み合わせごとに、細菌名と記述子がファイル 1 ハッシュにある場合は 0 または 1 を追加します。

入力ファイル (タブ区切り):

bacteria_1  protein:plasmid:149679
bacteria_1  protein:proph:183386
bacteria_2  protein:proph:183386
bacteria_3  protein:plasmid:147856
bacteria_3  protein:proph:183386

目的の出力 (タブ区切り):

    protein:plasmid:149679  protein:proph:183386    protein:plasmid:147856
bacteria_1  1   1   0
bacteria_2  0   1   0
bacteria_3  0   1   1
4

2 に答える 2

2

これが 1 つの方法GNU awkです。

awk '{
    header[$2]++; 
    bacteria[$1]++; 
    map[$1,$2]++
}
END { 
    x=asorti(header,header_s); 
    for(i=1;i<=x;i++) { 
        printf "\t%s\t", header_s[i]   
    }
    print ""
    y=asorti(bacteria,bacteria_s); 
    for(j=1;j<=y;j++) { 
        printf "%s\t\t", bacteria_s[j]; 
        for (z=1;z<=x;z++) {
            printf "%s\t\t\t\t", (map[bacteria_s[j],header_s[z]])?"1":"0"
        } 
    print ""
    } 
}' file
        protein:plasmid:147856          protein:plasmid:149679          protein:proph:183386
bacteria_1              0                               1                               1
bacteria_2              0                               0                               1
bacteria_3              1                               0                               1

通常のソリューションは次のawkとおりです。

awk '
!is_present[$1]++ {bacteria[++x] = $1}
!is_present[$2]++ {protein[++y] = $2}
{map[$1,$2]++}
END { 
    for(i=1; i<=y; i++) {
        printf "\t%s\t", protein[i]
    } 
    print ""; 
    for(j=1; j<=x; j++) { 
        printf "%s\t\t", bacteria[j]; 
        for(a=1; a<=y; a++) { 
        printf "%s\t\t\t\t", (map[bacteria[j], protein[a]])?"1":"0"
        }
    print ""
    }
}' file
于 2014-02-24T15:33:57.890 に答える