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
df2
、df3
第二df1
、第三、第一データフレーム別のファイルFILENAME
- 組み込み変数は、現在処理中のファイルの名前を指します。ARGV
- awkスクリプトに渡されたすべての引数を指す組み込み変数。それがARGV[1]
含まれていますdf2
FILENAME == ARGV[1] && NR>1
- 最初のファイルが見つかります(つまり、df2
2行目から始まります)。df2[$2,$3,$4]
- 以下からキー値を取得します。データフレーム2「を配列キーとしてdf2
FILENAME == ARGV[2] && FNR>1
df3
- 2行目から始まる2番目のファイルが見つかりました(例:)df3[$2,$3,$4]
- 以下からキー値を取得します。データフレーム3「を配列キーとしてdf3
FILENAME == ARGV[3]
- 3番目のファイル(例df1
:)が見つかりました。データフレーム