2014-06-15 5 views
6

मैं दो फाइलों से आंशिक मिलान वाले तारों को गठबंधन करने की कोशिश करने के साथ संघर्ष कर रहा हूं।आंशिक मिलान वाले तारों को मर्ज करें

फ़ाइल 1 में अद्वितीय तारों की एक सूची है। ये तार आंशिक रूप से कैसे मैं हर मामले के लिए मिलान किया फ़ाइल 2 के साथ फ़ाइल 1 में पंक्तियों को मिला है

File1

mmu-miR-677-5p_MIMAT0017239 
mmu-miR-181a-1-3p_MIMAT0000660 

File2

mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGA 
mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGACT 
mmu-miR-677-5p_TTCAGTGATGATTAGCTTCTGACT 
mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTAC 
mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTACC 

फ़ाइल 2 में तार के एक नंबर करने के लिए मिलान कर रहे हैं वांछित आउटपुट

mmu-miR-677-5p_MIMAT0017239  mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGA 
mmu-miR-677-5p_MIMAT0017239  mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGACT 
mmu-miR-677-5p_MIMAT0017239  mmu-miR-677-5p_TTCAGTGATGATTAGCTTCTGACT 
mmu-miR-181a-1-3p_MIMAT0000660 mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTAC 
mmu-miR-181a-1-3p_MIMAT0000660 mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTACC 

मैं आर में pmatch() उपयोग करने की कोशिश की है, ख यह सही नहीं है। मुझे लगता है कि कुछ perl संभाल लेंगे ??

हो सकता है कि कुछ इस तरह:

perl -ne'exec q;perl;, "-ne", q $print (/\Q$.$1.q;/?"$. YES":$. .q\; NO\;);, "file2" if m;^(.*)_pat1;' file1 

उत्तर

4

यह एक संक्षिप्त पर्ल समाधान है, जो file2 के रूप में हैश पर file1 से सभी डेटा की बचत होती है और उसके बाद पुन: प्राप्त करता यह स्कैन किया जाता है है

use strict; 
use warnings; 
use autodie; 

my @files = qw/ file1.txt file2.txt /; 

my %file1 = do { 
    open my $fh, '<', $files[0]; 
    map /([^_]+)_(\S+)/, <$fh>; 
}; 

open my $fh, '<', $files[1]; 
while (<$fh>) { 
    my ($key) = /([^_]+)/; 
    printf "%-32s%s", "${key}_$file1{$key}", $_; 
} 

उत्पादन

mmu-miR-677-5p_MIMAT0017239  mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGA 
mmu-miR-677-5p_MIMAT0017239  mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGACT 
mmu-miR-677-5p_MIMAT0017239  mmu-miR-677-5p_TTCAGTGATGATTAGCTTCTGACT 
mmu-miR-181a-1-3p_MIMAT0000660 mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTAC 
mmu-miR-181a-1-3p_MIMAT0000660 mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTACC 
3

बेशक आप वास्तव में आर में कर सकता है, pmatch ing पूरे तार आप इच्छित परिणाम नहीं देंगे - आप उचित सबस्ट्रिंग मिलान करने के लिए मिल गया है।

मुझे लगता है कि फ़ाइल 1 में पहला पहचानकर्ता 677 है और 667 नहीं है, अन्यथा मिलान योजना का अनुमान लगाना मुश्किल है (मुझे लगता है कि आपका उदाहरण केवल एक बड़े डेटाबेस का हिस्सा है)।

file1 <- readLines(textConnection('mmu-miR-677-5p_MIMAT0017239 
mmu-miR-181a-1-3p_MIMAT0000660')) 

file2 <- readLines(textConnection('mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGA 
mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGACT 
mmu-miR-677-5p_TTCAGTGATGATTAGCTTCTGACT 
mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTAC 
mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTACC')) 

library(stringi) 
file1_id <- stri_extract_first_regex(file1, "^.*?(?=_)") 
file2_id <- stri_extract_first_regex(file2, "^.*?(?=_)") 

cbind(file1=file1[match(file2_id, file1_id)], file2=file2) 
##  file1       file2          
## [1,] "mmu-miR-677-5p_MIMAT0017239" "mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGA" 
## [2,] "mmu-miR-677-5p_MIMAT0017239" "mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGACT" 
## [3,] "mmu-miR-677-5p_MIMAT0017239" "mmu-miR-677-5p_TTCAGTGATGATTAGCTTCTGACT" 
## [4,] "mmu-miR-181a-1-3p_MIMAT0000660" "mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTAC" 
## [5,] "mmu-miR-181a-1-3p_MIMAT0000660" "mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTACC" 
+0

जब मैं अपने csv फ़ाइल से पढ़ा यह शिकायत के बारे में str एक चरित्र वेक्टर नहीं किया जा रहा: ("।?^* (= _)" File1,) stri_extract_first_regex में त्रुटि: तर्क 'str' – user3741035

+0

पर एक वर्ण वेक्टर (या ऑब्जेक्ट कोर्सीबल) होना चाहिए शायद आपको इसके लिए' रीडलाइन 'का उपयोग करना चाहिए? – gagolews

+1

@ user3741035 आपको कम से कम उनसे मिलान करने से पहले फ़ाइलों को पढ़ने की कोशिश करनी चाहिए। यहां दिए गए उत्तरों मानते हैं कि आपके पास आर फाइलें पढ़ने/लिखने के लिए मूलभूत है। – agstudy

2

आप अस्पष्ट खोज के लिए agrep कर सकते हैं। आपको दूरी के साथ खेलना चाहिए। यहाँ मैं यह 11.

मूल रूप से करने के लिए मैन्युअल रूप से फिक्सिंग कर रहा हूँ मैं यह कर रहा हूं लाइनों संख्या कि file1 में प्रत्येक शब्द से मेल खाता है निकालने के लिए:

do.call(rbind, 
    lapply(file1, 
     function(x) 
     data.frame(file1=x, 
        file2=agrep(x,file2,max=11,value=T)))) 


         file1         file2 
1 mmu-miR-677-5p_MIMAT0017239 mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGA 
2 mmu-miR-677-5p_MIMAT0017239 mmu-miR-677-5p_CTTCAGTGATGATTAGCTTCTGACT 
3 mmu-miR-677-5p_MIMAT0017239 mmu-miR-677-5p_TTCAGTGATGATTAGCTTCTGACT 
4 mmu-miR-181a-1-3p_MIMAT0000660 mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTAC 
5 mmu-miR-181a-1-3p_MIMAT0000660 mmu-miR-181a-1-3p_ACCATCGACCGTTGATTGTACC 
:

sapply(file1,agrep,file2,max=11) 
$`mmu-miR-677-5p_MIMAT0017239` 
[1] 1 2 3 

$`mmu-miR-181a-1-3p_MIMAT0000660` 
[1] 4 5 

एक data.frame का परिणाम प्राप्त करने के लिए

+0

यह मेरी अपूर्ण फ़ाइलों में पंक्तियों की अलग-अलग संख्या के बारे में शिकायत करता है: 'चेतावनी संदेश: agrep (x, file2, max = 11, value = T) में: तर्क' पैटर्न 'की लंबाई> 1 है और केवल पहला तत्व होगा प्रयुक्त do.call में त्रुटि (rbind, lapply (file1, function (x) data.frame (file1 = x, फ़ंक्शन 'do.call' के लिए विधि चुनने में तर्क 'args' का मूल्यांकन करने में त्रुटि: त्रुटि में data.frame (file1 = x, file2 = agrep (x, file2, max = 11, value = t)): तर्कों में अलग-अलग पंक्तियों का अर्थ है: 1 9 08, 0 ' – user3741035

+0

@ user3741035 जब आप gagolews उत्तर में दिए गए डेटा 'file1' और' file2' के साथ प्रयास करते हैं तो आपको क्या मिला? – agstudy

संबंधित मुद्दे