サイズの異なる複数のファイルの列を比較し、一致しない値をNAに置き換えます。

サイズの異なる複数のファイルの列を比較し、一致しない値をNAに置き換えます。

3つのデータフレームがあります。

データフレーム1

chr start end Id chr1 1 400 SN_1 chr1 401 800 SN_2 chr1 801 1200 SN_3 chr1 1201 1600 SN_4 chr1 1601 2000 SN_5 chr1 2001 2400 SN_6 chr1 2401 2800 SN_7

データフレーム2

chr start end Id chr1 401 800 SN_2 chr1 801 1200 SN_3 chr1 1201 1600 SN_4

データフレーム3

chr start end Id chr1 1201 1600 SN_4 chr1 1601 2000 SN_5 chr1 2001 2400 SN_6

最初のデータフレームの4番目の列に基づいて、2番目と3番目のデータフレームの4番目の列に基づいて一致または不一致が報告される最終データフレームを取得したいと思います。新しいデータフレームに一致するものがある場合は同じIDが報告されますが、一致するものがある場合はID名はNAに置き換えられます。たぶん、入力と出力を書くのがわかりやすくなります。このような:

希望の出力:

chr start end Id Id Id chr1 1 400 SN_1 NA NA chr1 401 800 SN_2 SN_2 NA chr1 801 1200 SN_3 SN_3 NA chr1 1201 1600 SN_4 SN_4 SN_4 chr1 1601 2000 SN_5 NA SN_5 chr1 2001 2400 SN_6 NA SN_6 chr1 2401 2800 SN_7 NA NA

unixコマンドでJoinを試してみましたが、サイズの異なるデータフレームを比較することはできません。どんなアイデアでも大いに感謝します。

ベストアンサー1

アッ解決策:

awk 'FILENAME == ARGV[1] && NR>1{ df2[$2,$3,$4] }
     FILENAME == ARGV[2] && FNR>1{ df3[$2,$3,$4] }
     FILENAME == ARGV[3]{ if(FNR == 1) { printf("%s\t%s\t%s\n",$0,$NF,$NF) } 
     else { printf("%s\t%s\t%s\n",$0, (($2,$3,$4) in df2)? $NF :"NA",(($2,$3,$4) in df3)? $NF :"NA")} 
}' df2 df3 df1 | column -t

出力:

chr   start  end   Id    Id    Id
chr1  1      400   SN_1  NA    NA
chr1  401    800   SN_2  SN_2  NA
chr1  801    1200  SN_3  SN_3  NA
chr1  1201   1600  SN_4  SN_4  SN_4
chr1  1601   2000  SN_5  NA    SN_5
chr1  2001   2400  SN_6  NA    SN_6
chr1  2401   2800  SN_7  NA    NA

  • df2df3第二df1、第三、第一データフレーム別のファイル

  • FILENAME- 組み込み変数は、現在処理中のファイルの名前を指します。

  • ARGV- awkスクリプトに渡されたすべての引数を指す組み込み変数。それがARGV[1]含まれていますdf2

  • FILENAME == ARGV[1] && NR>1- 最初のファイルが見つかります(つまり、df22行目から始まります)。

    • df2[$2,$3,$4]- 以下からキー値を取得します。データフレーム2「を配列キーとしてdf2
  • FILENAME == ARGV[2] && FNR>1df3- 2行目から始まる2番目のファイルが見つかりました(例:)

    • df3[$2,$3,$4]- 以下からキー値を取得します。データフレーム3「を配列キーとしてdf3
  • FILENAME == ARGV[3]- 3番目のファイル(例df1:)が見つかりました。データフレーム

おすすめ記事