列の重複項目を削除し、複数行の値を単一行に線形化します。

列の重複項目を削除し、複数行の値を単一行に線形化します。

次の表があります。

DAPPUDRAFT_194440   Phosphorous     
DAPPUDRAFT_194440   Temperature     
DAPPUDRAFT_194472   Phosphorous Fishkairomones  
DAPPUDRAFT_194472   Temperature     
DAPPUDRAFT_194512   Fishkairomones      
DAPPUDRAFT_194512   Cadmium Zinc    Quantumdots
DAPPUDRAFT_195644   Salinity        
DAPPUDRAFT_195644   Phosphorous     
DAPPUDRAFT_196131   Salinity        
DAPPUDRAFT_196131   Phosphorous     
DAPPUDRAFT_196131   hypoxia     
DAPPUDRAFT_196694   Salinity        

ご覧のとおり、さまざまな数の列(タブ区切り)にデータを含めることができます。

「DAPPUDRAFT_」で始まる最初の列の重複エントリは削除する必要があり、複数行に表示される他のすべての値は単一行に表示される必要があります。

たとえば、私の入力テーブルでは、「DAPPUDRAFT_194440」はテーブルに2回表示されます。ここで、データサブセットに示すように、1行には「Temperature」、2行目には「Phosphorus」という2つの値があります。

 DAPPUDRAFT_194440   Phosphorous     
 DAPPUDRAFT_194440   Temperature  

私が見たいのは、「DAPPUDRAFT_」が一度だけ表示され、「Temperature」と「Phosphorus」の2つの項目が次のようにタブで区切られ、同じ行に表示されなければならないということです。

 DAPPUDRAFT_194440   Phosphorous   Temperature  

予想出力:

DAPPUDRAFT_194440   Phosphorous Temperature     
DAPPUDRAFT_194472   Phosphorous Fishkairomones  Temperature 
DAPPUDRAFT_194512   Fishkairomones  Cadmium Zinc    Quantumdots
DAPPUDRAFT_195644   Salinity    Phosphorous     
DAPPUDRAFT_196694   Salinity            
DAPPUDRAFT_196131   Salinity    Phosphorous hypoxia 

Rで「reshape2」パッケージとdcast機能を試してみました。しかし、それは私が望むものとはまったく異なることをします。コマンドライン、R、またはPerlでこの問題を解決するのに役立つ方法はありますか?

答え1

簡単にアッ:

awk '{ r=$0; sub($1,"",r); a[$1]=(a[$1])? a[$1]"\t"r : r }
     END{ for(i in a) { gsub(/[[:space:]]{2,}/," ",a[i]); print i,a[i] } }' file

  • r=$0- 記録のコピーをキャプチャします。

  • sub($1,"",r)- コピーの最初のフィールドを削除して、残りのフィールドをr変数に保存します。

  • a[$1]=(a[$1])? a[$1]"\t"r : r- 同じ価値を築くグループ(セッション1で提案)

  • for(i in a)- グループ化されたすべての項目を繰り返します。

  • gsub(/[[:space:]]{2,}/," ",a[i])- 単語の間に不要なスペースを削除します。

  • print i,a[i]- グループ名と値の印刷


出力:

DAPPUDRAFT_194440  Phosphorous Temperature 
DAPPUDRAFT_196694  Salinity
DAPPUDRAFT_194512  Fishkairomones Cadmium Zinc Quantumdots
DAPPUDRAFT_194472  Phosphorous Fishkairomones Temperature 
DAPPUDRAFT_196131  Salinity Phosphorous hypoxia 
DAPPUDRAFT_195644  Salinity Phosphorous 

答え2

または

$ perl -e 'while(<ARGV>){chomp;($x,$y)=split(/\s+/,$_,2);$hash{$x}.=$y;}for(keys %hash){print "$_ $hash{$_}\n";}' test1
DAPPUDRAFT_196694 Salinity
DAPPUDRAFT_194440 Phosphorous     Temperature
DAPPUDRAFT_195644 Salinity        Phosphorous
DAPPUDRAFT_194472 Phosphorous Fishkairomones  Temperature
DAPPUDRAFT_194512 Fishkairomones      Cadmium Zinc    Quantumdots
DAPPUDRAFT_196131 Salinity        Phosphorous     hypoxia

答え3

行と要素の並べ替え方法に興味がない場合は、次の操作を行います。

sed 'G;s/^\(.*\)\(\t.*\)\n\(.*\)\1/\3\1\2/;h;$!d;s/\n$//' file

GNUでない場合は、文字通りTABにsed置き換えられます。\t

関連情報