Dataframe 是否可以使用Perl将数据帧与不同数量的行合并?
我有个小问题我解决不了 我有两个数据帧(DF):第一个(主DF)有8列和45918行,第二个(补充DF)有4列和97969行。 如果您想查看完整的DF,以下是指向my GitHub的链接: 下面是一个与DF类似的示例 主DF: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
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