0

2 つのマトリックス (たとえば、A と B) があります。A の最初の列の順序に基づいて B の列を抽出したいと思います。

例えば

行列 A

name score
a 0.1
b 0.2
c 0.1
d 0.6

行列 B

a    d   b   c   g   h
0.1 0.2 0.3 0.4 0.6 0.2
0.2 0.1 0.4 0.7 0.1 0.1
...

マトリックスBを最後にこのようにしたい

マトリックス B_modified

a    b   c   d
0.1 0.3 0.4 0.2
0.2 0.4 0.7 0.1

これは perl または R で実行できますか? 事前にどうもありがとう

4

3 に答える 3

2

データが R データ構造として作成されている場合、それをエクスポートして Perl を使用してこの問題を解決するのは間違っています。ただし、表示したデータのように見えるテキスト ファイルがある場合は、ここに Perl ソリューションがあります。

出力をスペースで分割しました。これは、必要に応じて非常に簡単に変更できます。

use strict;
use warnings;
use autodie;

sub read_file {
  my ($name) = @_;
  open my $fh, '<', $name;
  my @data = map [ split ], <$fh>;
  \@data;
}

my $matrix_a = read_file('MatrixA.txt');
my @fields = map $matrix_a->[$_][0], 1 .. $#$matrix_a;

my $matrix_b = read_file('MatrixB.txt');
my @headers = @{$matrix_b->[0]};
my @indices = map {
  my $label = $_;
  grep $headers[$_] eq $label, 0..$#headers
} @fields;

for my $row (0 .. $#$matrix_b) {
  print join('  ', map $matrix_b->[$row][$_], @indices), "\n";
}

出力

a  b  c  d
0.1  0.3  0.4  0.2
0.2  0.4  0.7  0.1
于 2013-04-07T15:40:38.170 に答える
2

エラー :

[.data.frame(b, , a[, "name"]) : undefined columns selected

で定義されてbいないが に存在する列を取得しようとしていることを意味しますa$name。1 つの解決策は、 を使用intersectすることcolnames(b)です。これにより、要素も文字列に変換され、正しい順序が得られます。

b[, intersect(a[, "name"],colnames(b))] ## the order is important here 

たとえば、次のデータでこれをテストします。

b <- read.table(text='
a    d   b   c
0.1 0.2 0.3 0.4
0.2 0.1 0.4 0.7',header=TRUE)

a <- read.table(text='name score
a 0.1
z 0.5
c 0.1
d 0.6',header=TRUE)

b[, intersect(a[, "name"],colnames(b))]


    a   c   d
1 0.1 0.4 0.2
2 0.2 0.7 0.1
于 2013-04-07T11:56:40.837 に答える