【发布时间】:2017-10-31 14:50:38
【问题描述】:
我有两个文件:
1) 一个
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
但这只是返回一个未改变的“a”
我也尝试在 R 中处理这个问题:
a[a$V2 == b$chr && a$V3 >= b$start && a$V3 <= b$stop, ]
我知道这是无用的,因为这会并排比较列。它抛出一个错误,告诉我“较长的对象长度不是较短对象长度的倍数”。
我还尝试在 data.table 中使用“foverlaps”,以“b”列作为键
不幸的是,这是我目前最好的。
有什么建议吗?我正在寻找的输出是:
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
谢谢!!!
【问题讨论】: