我有两个文件:
1)a
code chr position score
code123947 10 13417 0.9221900
code456747 10 717559 1.0000000
code523452 10 1554421 0.5315330
code223534 10 2354490 0.0479356
code654321 10 4461920 0.9144420
code345635 10 5564649 0.7069120
code214234 10 115746 0.7191680
code654332 10 133160 0.4205290
code263562 10 135203 0.7178790
code987654 10 230894 0.5351590
2)b
chr start stop
10 60523 751339
10 751339 1523544
10 1523544 2254500
10 2254500 3352699
10 3352699 4572274
10 4572274 5983762
10 5983762 7171484
10 7171484 8774665
10 8774665 10249396
我需要子文件" a"仅用于匹配" chr" "位置"落入"开始" - "停止"文件" b"
我尝试了以下内容:
awk 'NR==FNR{ range[$1,$2,$3]; next }
FNR==1
{
for(x in range) {
split(x, check, SUBSEP);
if($2==check[1] && $3>=check[2] && $3<=check[3]) print $0
}}
' b a
但这只会返回一个未经改动的&#34; a&#34;
我也试图在R中处理这个问题:
a[a$V2 == b$chr && a$V3 >= b$start && a$V3 <= b$stop, ]
我知道是无用的,因为这会将列并排比较。它会抛出一个错误,告诉我&#34;较长的物体长度不是较短物体长度的倍数&#34;。
我还尝试使用&#34; foverlaps&#34;在data.table中使用&#34; b&#34;列作为键
不幸的是,这是我现在最好的。
有什么建议吗?我正在寻找的输出是:
code chr position score
code456747 10 717559 1.0000000
code523452 10 1554421 0.5315330
code223534 10 2354490 0.0479356
code654321 10 4461920 0.9144420
code345635 10 5564649 0.7069120
感谢!!!
答案 0 :(得分:1)
x <- merge(a, b, by = 'chr')
x <- x[x$V3 >= x$start && x$V3 <= x$stop, ]
您可以将两个数据框合并在一起,然后像过去一样进行过滤。
答案 1 :(得分:0)
与join
辅助awk
$ join -12 -21 a b | awk '$5<=$3 && $3<=$6{print $2,$1,$3,$4}'
code456747 10 717559 1.0000000
code523452 10 1554421 0.5315330
code223534 10 2354490 0.0479356
code654321 10 4461920 0.9144420
code345635 10 5564649 0.7069120
code214234 10 115746 0.7191680
code654332 10 133160 0.4205290
code263562 10 135203 0.7178790
code987654 10 230894 0.5351590
PS。文件需要在关键字段上排序