मेरे पास दो फाइलें हैं:

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) बी

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

मुझे फ़ाइल "ए" को केवल उन पंक्तियों के लिए सब्मिट करने की आवश्यकता है, जिसमें "chr" से मेल खाने के लिए "स्थिति" फ़ाइल "बी" के "स्टार्ट" - "स्टॉप" के भीतर आती है।

मैंने निम्नलिखित कोशिश की है:

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[a$V2 == b$chr && a$V3 >= b$start && a$V3 <= b$stop, ]

जो मुझे पता है वह बेकार है क्योंकि यह कॉलम की साथ-साथ तुलना करता है। यह मुझे यह बताते हुए एक त्रुटि फेंकता है कि "लंबी वस्तु की लंबाई छोटी वस्तु की लंबाई का गुणक नहीं है"।

मैंने डेटा में "फोवरलैप्स" का उपयोग करने का भी प्रयास किया। कुंजी के रूप में "बी" कॉलम के साथ टेबल

दुर्भाग्य से, यह अभी मेरे पास सबसे अच्छा है।

कोई सुझाव? मैं जिस आउटपुट की तलाश कर रहा हूं वह है:

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
Don B. 31 अक्टूबर 2017, 17:50

2 जवाब

सबसे बढ़िया उत्तर
x <- merge(a, b, by = 'chr')
x <- x[x$V3 >= x$start && x$V3 <= x$stop, ]

आप दो डेटाफ़्रेम को एक साथ मर्ज कर सकते हैं और फिर पहले की तरह फ़िल्टर कर सकते हैं।

1
troh 31 अक्टूबर 2017, 18:24

इसी तरह 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

पुनश्च. फ़ाइलों को कुंजी फ़ील्ड पर सॉर्ट करने की आवश्यकता है

0
karakfa 31 अक्टूबर 2017, 18:33