2012-05-17 127 views
1

我想根据一列匹配两个文件并合并匹配的行。但其中一个文件(file1.txt)多次具有相同的条目。作为一个例子:根据列匹配合并两个文件 - 其中一个文件的列有多个相同的条目

FILE1.TXT

chr:123 a 
chr:123 b 
chr:456 a 

FILE2.TXT

chr:123 aa 
chr:456 bb 

我想提取基于第一列中的索引。

最终的输出应该是这样的:

chr:123 a aa 
chr:123 b aa 
chr:456 a bb 

我试图相交R上,但无法弄清楚如何匹配的行合并时file1.txt具有相同的条目超过一次。 我使用两个for循环,但文件非常大,需要大量时间。

是否有更快的方式在perl或R中执行此操作?

+2

在'merge'和'all.x = TRUE'看看参数。 – thelatemail

回答

2

试试这个:

one <- data.frame(
id=c("chr:123","chr:123","chr:456"), 
value=c("a","b","a") 
) 

two <- data.frame(
id=c("chr:123","chr:456"), 
value=c("aa","bb") 
) 

merge(one,two,by="id",all.x=TRUE) 

#result 
     id value.x value.y 
1 chr:123  a  aa 
2 chr:123  b  aa 
3 chr:456  a  bb 
+0

非常感谢:)这将为我节省大量的时间。 – user1007742

1

这里的另一种选择:

use Modern::Perl; 

my %file1Hash; 

open my $file1, "<file1.txt" or die $!; 
do { my ($key, $value) = split; push @{ $file1Hash{$key} }, $value } 
    for <$file1>; 
close $file1; 

open my $file2, "<file2.txt" or die $!; 
do { 
    my ($key, $value) = split; 
    do { say "$key $_ $value" for @{ $file1Hash{$key} } } if $file1Hash{$key}; 
    } 
    for <$file2>; 
close $file2; 

输出:

chr:123 a aa 
chr:123 b aa 
chr:456 a bb 
相关问题