Dataframe 是否可以使用Perl将数据帧与不同数量的行合并?

Dataframe 是否可以使用Perl将数据帧与不同数量的行合并?,dataframe,perl,Dataframe,Perl,我有个小问题我解决不了 我有两个数据帧(DF):第一个(主DF)有8列和45918行,第二个(补充DF)有4列和97969行。 如果您想查看完整的DF,以下是指向my GitHub的链接: 下面是一个与DF类似的示例 主DF: ID1 ID2 dN dS Omega Label_ID1 Label_ID2 Group AVP78042 AVP78031 0.0059

我有个小问题我解决不了

我有两个数据帧(DF):第一个(主DF)有8列和45918行,第二个(补充DF)有4列和97969行。 如果您想查看完整的DF,以下是指向my GitHub的链接:

下面是一个与DF类似的示例

主DF:

ID1          ID2         dN          dS          Omega       Label_ID1       Label_ID2       Group
AVP78042     AVP78031    0.0059      0.1188      0.0500      SARSr-bat-CoV   SARSr-bat-CoV   Intra
ATO98108     AVP78031    0.1373      1.4673      0.0936      SARSr-bat-CoV   SARSr-bat-CoV   Intra
ATO98108     AVP78042    0.1371      1.4224      0.0964      SARSr-bat-CoV   SARSr-bat-CoV   Intra
补充DF:

Distance    ID_1        ID_2        Value
DISTANCE    AVP78042.1  ATO98108.1  0.29731
DISTANCE    AVP78042.1  ATO98120.1  0.29281
DISTANCE    AVP78042.1  ATO98132.1  0.33095
在这种情况下,我的主要目标是将互补的列(ID_1、ID_2和Value)合并到主DF。在这两种情况下,ID_1和ID_2是相同的,但顺序不同

为此,我想在两个数据帧之间的ID_1和2之间进行匹配,当匹配为真时,将列值(互补DF)添加到主DF。我认为在一个“如果”的条件下这样做。 这里的问题可能是每个DF之间的行数和标签顺序(ID_1和ID_2)不同。
之前,我使用Perl脚本合并DF:


use strict;
use warnings;
use feature qw{ say };

sub load {
    my ($file, $table, $phase) = @_;
    open my $in, '<', $file or die "$file: $!";
    while (<$in>) {
        chomp;
        my @columns = split /\t/;
        my $id = join '_', @columns[0, 1];
        die "Duplicate $id."
            if 'first' eq $phase && exists $table->{$id};

        push @{ $table->{$id} }, $columns[2];
        say join "\t", @columns[0, 1], @{ $table->{$id} }
            if 'print' eq $phase;
    }
}

my %table;
my $phase = 'first';
while (my $file = shift @ARGV) {
    load($file, \%table, $phase);
    $phase = 1 == @ARGV ? 'print' : '';
}
我将“-”放在列值中,以显示ID_1和ID_2之间的“不匹配”示例

我尝试了不同的方法,但是,我还不能解决这个问题


有什么建议或意见吗?

更改输入文件后:

Main DF:
ID1          ID2         dN          dS          Omega
AVP78042     AVP78031    0.0059      0.1188      0.0500 
ATO98108     AVP78031    0.1373      1.4673      0.0936 
ATO98108     AVP78042    0.1371      1.4224      0.0964 
...
Complementary DF:
ID1          ID2        Value
AVP78042.1  ATO98108.1  0.29731
AVP78042.1  ATO98120.1  0.29281
...
此脚本在ID之间匹配时合并列:

#!/usr/bin/perl
use strict;
use warnings;

my $file01 = $ARGV[0];
my $file02 = $ARGV[1];
my @content02;

open (B, $file02) or die;
while (my $l1 = <B>) {
  $l1 =~ s/\n//g;
  $l1 =~ s/\r//g;
  $l1 =~ s/^ //g;
  push @content02, $l1 ;
}
close B;

### Running with the first file ()
open (A, $file01) or die;

LINE:
while (my $l2 = <A>) { # From file 1 (ref)
  $l2 =~ s/\n//g;
  $l2 =~ s/\r//g;
  $l2 =~ s/ //g;
  my @matrix_2 = split ("\t", $l2);
  my $two_id_01 = $matrix_2[0]; ### No tiene punto
  my $two_id_02 = $matrix_2[1]; ### No tiene punto

  foreach my $q (@content02) { ### From file 2
    my @matrix_q = split ("\t", $q);
    my $q_id_01 = $matrix_q[0];
    my $q_id_02 = $matrix_q[1];
    my $value = $matrix_q[2];

    if (($q_id_01 =~ /^$two_id_01/) and ( $q_id_02 =~ /^$two_id_02/) ) {
      print "$l2\t$value\n";
      next LINE;
    }
  }
}


close A;

exit;
#!/usr/bin/perl
use strict;
use warnings;

my $file01 = $ARGV[0];
my $file02 = $ARGV[1];
my @content02;

open (B, $file02) or die;
while (my $l1 = <B>) {
  $l1 =~ s/\n//g;
  $l1 =~ s/\r//g;
  $l1 =~ s/^ //g;
  push @content02, $l1 ;
}
close B;

### Running with the first file ()
open (A, $file01) or die;

LINE:
while (my $l2 = <A>) { # From file 1 (ref)
  $l2 =~ s/\n//g;
  $l2 =~ s/\r//g;
  $l2 =~ s/ //g;
  my @matrix_2 = split ("\t", $l2);
  my $two_id_01 = $matrix_2[0]; ### No tiene punto
  my $two_id_02 = $matrix_2[1]; ### No tiene punto

  foreach my $q (@content02) { ### From file 2
    my @matrix_q = split ("\t", $q);
    my $q_id_01 = $matrix_q[0];
    my $q_id_02 = $matrix_q[1];
    my $value = $matrix_q[2];

    if (($q_id_01 =~ /^$two_id_01/) and ( $q_id_02 =~ /^$two_id_02/) ) {
      print "$l2\t$value\n";
      next LINE;
    }
  }
}


close A;

exit;
Merge DF (6 columns x 42336 rows) 
ID1          ID2         dN     dS      Omega   Value
ATO98108    AVP78042    0.1371  1.4224  0.0964  0.29731
ATO98120    AVP78042    0.1376  1.2989  0.1060  0.29281