2014-06-15 138 views
6

我努力嘗試將來自兩個文件的部分匹配字符串組合在一起。合併部分匹配的字符串

文件1包含一個唯一字符串列表。這些字符串部分匹配的數量在文件2串如何合併文件1行與文件2每個匹配的情況下

文件1

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

文件2

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 

期望的輸出

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 

我已經嘗試在R,b中使用pmatch()不要誤會。我看起來像perl會處理?

也許是這樣的:

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

回答

4

這是一個簡短的Perl溶液,將其從在哈希file1保存所有的數據,然後檢索它作爲file2被掃描

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

當然,你可以做到這一點在R.事實上,pmatch荷蘭國際集團整個字符串不會給你想要的結果 - 你必須匹配相應的字符串。

我假設在文件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不是一個特徵向量( 「?^ *(= _)」 文件1)在stri_extract_first_regex錯誤: 說法'str'應該是一個字符向量(或者一個強制對象) – user3741035

+0

也許你應該使用'readLines'呢? – gagolews

+1

@ user3741035你應該至少嘗試在匹配它們之前閱讀文件。這裏的答案假設你有基本的讀/寫R文件。 – agstudy

2

您可以通過agrep進行模糊搜索。你應該玩遙遠的距離。在這裏,我手動修復它11

基本上我這樣做是爲了提取出每個單詞文件1匹配的行數:

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結果:

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 
+0

它抱怨我的輸入文件中的行數不同:'警告消息: 在agrep(x,file2,max = 11,value = T)中: 參數'pattern'的長度> 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)): 參數表示行數不同:1908,0' – user3741035

+0

@ user3741035當您嘗試使用gagolews答案中提供的數據'file1'和'file2'時,您得到了什麼? – agstudy