3

列数が異なる 2 つのデータセットがあります。

DS1:

A   B   C
1   2   3

DS2:

A   C   D
2   3   4

次に、これら 2 つのデータセットをマージします。

結果:

A   B   C   D
1   2   3   0
2   3   0   4

ご覧のとおり、変数名が両方のデータセットに存在しない場合は、0、NaN、または空白を追加したいだけです。catとを使用しようとしましjoinたが、その方法がわかりません。ヒントはありますか?

4

3 に答える 3

3

これは醜い方法です-そして、以下のよりクリーンな方法です(後で追加されます)。問題は、セル配列を扱うとすぐに (データ型が混在しているため (列は文字、次に数字)、生活が困難になることです。列名とデータが 2 つの別個の配列 (以下を参照) である構造を作成することで、おそらくより良い結果が得られますが、ここでは「解決策」を示します。2 つのデータセットの行数と列数を変えることで、生活を少し面白くしました。何かが壊れないようにするためです。

ds1 = {'a','bb','c';1,2,3};
ds2 = {'aa','c','d', 'e';2,3,4,5; 5,6,7,8};
cols = unique({ds1{1,:} ds2{1,:}});

ds3 = cols;
n1 = size(ds1,1) - 1;
%%
for ii = 1:size(ds1,2)
    ci = find(cellfun(@(x) isequal(x, ds1{1,ii}), cols));
    if numel(ci) > 0
        for jj = 1:n1
            ds3{1+jj,ci} = ds1{1+jj, ii};
        end
    end
end
n2 = size(ds2, 1) - 1;
for ii = 1:size(ds2,2)
    ci = find(cellfun(@(x) isequal(x, ds2{1,ii}), cols));
    if numel(ci) > 0
        for jj = 1:n2
            ds3{1+n1+jj,ci} = ds2{1+jj, ii};
        end
    end
end

結果のマージされた配列:

'a'   'aa'  'bb'   'c'    'd'   'e'
[1]     []   [ 2]   [3]    []    []
 []   [ 2]     []   [3]   [4]   [5]
 []   [ 5]     []   [6]   [7]   [8]

確かに最適ではありません-しかし、それはあなたが求めたことを実行します...ループでこれを行うのは嫌いですが、それを回避する方法がわかりませんでした。「真の Matlab エキスパート」の 1 人がこれを見て吐き気を催し、巧妙な 1 行の回答を提供するように促されることを願っています。

編集私はこれについてもう少し考え、はるかに効率的なアルゴリズムを思いつきました:

% assuming column headers and data are in two separate arrays
ds1headers = {'a','bb','c'};
ds1data = [1 2 3; 2 3 4];
ds2headers = {'aa','c','d', 'e'};
ds2data = [2 3 4 5; 3 4 5 6; 4 5 6 7];

% as before, find unique column headers:
cols = unique({ds1headers{:} ds2headers{:}});

% convert to column numbers:
ds1conv = cellfun(@(x)find(ismember(cols, x)), ds1headers);
ds2conv = cellfun(@(x)find(ismember(cols, x)), ds2headers);

% now conversion is easy:
n1 = size(ds1data,1);
n2 = size(ds2data,1);
ds3data = zeros(n1+n2, numel(cols));

ds3data(1:n1, ds1conv) = ds1data;
ds3data(n1+(1:n2), ds2conv) = ds2data;

disp(cols)
disp(ds3data)

結果は

'a'    'aa'    'bb'    'c'    'd'    'e'

 1     0     2     3     0     0
 2     0     3     4     0     0
 0     2     0     3     4     5
 0     3     0     4     5     6
 0     4     0     5     6     7

それはうまくいくように見えます-醜いループはありません...これは、以下の@Maglaのソリューションに少し似ていることがわかりました(更新を投稿したときは見ませんでしたが、最新の編集の前には明らかにそこにありました) - ただし、列名のセル配列とその他のいくつかの改善点があります。

于 2013-07-12T16:48:26.830 に答える