2016-04-25 8 views
0

innerjoinを使用してマージする必要がある2つのテーブルがあります(または実際にはいくつかあります)。期待どおりに動作します。ただし、実際には元の行順に並べ替える必要があるため、データを破棄する「キー」を並べ替える点が異なります。ヘルプセクションからキーでソートしないマージテーブル

Cキー変数

t1 = Case Val 
3 1 
1 1 
2 1 

t2 = Val2 Case Subset 
2 2 2 
1 2 2 
2 3 1 

tnew = innerjoin(t1,t2) 

tnew = Case Val Val2 Subset 
2 ... 
% will start with "2" since its a lower value than "3", but in t1 "3" was in lower row than "2", it is rearranged 

内の値によってソートさはどのようにしてソートを避けるべきですか?役に立たない innerjoinを使用しますか?

答えて

1

結果テーブルに加えて、innerjoinは2つの余分な出力を返します。出力の行に対応する最初のテーブルの行インデックスと2番目のテーブルの行インデックス。

2番目の出力を使用してt1の行を特定し、これらを並べ替えることができます。次に、ソート順を使用して、結合の結果の行の順序を変更します。

%// Setup the data 
t1 = table([3;1;2], [1;1;1], 'VariableNames', {'Case', 'Val'}); 
t2 = table([2;1;2],[2;2;3],[2;2;1], 'VariableNames', {'Val2', 'Case', 'Subset'}); 


%// Perform the inner join and keep track of where the rows were in t1 
[tnew, rows_in_t1] = innerjoin(t1, t2); 

%// Sort them in order to maintain the order in t1 
[~, sortinds] = sort(rows_in_t1); 

%// Apply this sort order to the new table 
tnew = tnew(sortinds,:); 

%// Case Val Val2 Subset 
%// ____ ___ ____ ______ 
%// 3  1  2  1  
%// 2  1  2  2  
%// 2  1  1  2 
+0

ありがとう、これは完璧に機能しました! – Erik

関連する問題