1

1 つの列に基づいて 2 つのファイルを照合し、一致する行を結合したいと考えています。しかし、ファイルの 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 で intersect を試みましたfile1.txtが、同じエントリが複数回ある場合に一致する行を結合する方法がわかりませんでした。2 つの for ループを使用していますが、ファイルが非常に大きく、時間がかかります。

perl または R でこれを行うより迅速な方法はありますか?

4

2 に答える 2

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
于 2012-05-17T23:24:32.720 に答える
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
于 2012-05-18T14:07:18.970 に答える