Вопрос по merge, matlab – Объединение данных из разных массивов ячеек в Matlab

0

У меня есть данные в Matlab в формате массива ячеек со столбцами, представляющими различные элементы. Массивы ячеек имеют разные столбцы, как в следующем примере:

a = {'A', 'B', 'C' ; 1, 1, 1; 2, 2, 2 }

а =

'A'    'B'    'C'
[1]    [1]    [1]
[2]    [2]    [2]

b = {'C', 'D'; 3, 3; 4, 4}

б =

'C'    'D'
[3]    [3]
[4]    [4]

Я хотел бы иметь возможность присоединиться к различным массивам ячеек следующим образом:

с =

'A'    'B'    'C'    'D'
[1]    [1]    [1]    [NaN]
[2]    [2]    [2]    [NaN]
[NaN]  [NaN]  [3]    [3]
[NaN]  [NaN]  [4]    [4]

В реальном примере у меня есть сотни столбцов и несколько строк, поэтому создание нового массива ячеек вручную для меня не вариант.

Спасибо @Amro, я видел страницу, на которую вы ссылались выше, но решение этой функции работает немного иначе, чем мне требовалось. Andrew
Привет, как сказал Эмреа ниже, я стремлюсь присоединиться к массивам ячеек на основе их первого ряда. Благодарю. Andrew
Вы хотите быть первыми двумя столбцами из a и другими из c? Но держать только первый ряд смешанным? petrichor
@ Андрей: ну, теперь у вас есть несколько решений ниже на выбор Amro

Ваш Ответ

3   ответа
3

что вы хотите объединить эти два массива только на основе их первого ряда.

% get the list of all keys
keys = unique([a(1,:) b(1,:)]);

lena = size(a,1)-1;  lenb = size(b,1)-1;

% allocate space for the joined array
joined = cell(lena+lenb+1, length(keys));

joined(1,:) = keys;

% add a
tf = ismember(keys, a(1,:));
joined(2:(2+lena-1),tf) = a(2:end,:);

% add b
tf = ismember(keys, b(1,:));
joined((lena+2):(lena+lenb+1),tf) = b(2:end,:);

Это даст вам объединенный массив, за исключением того, что он содержит пустые ячейки вместо NaN. Я надеюсь, что это нормально.

1

старый другой на аналогичный вопрос (просто транспонировать строки / столбцы):

%# input cell arrays
a = {'A', 'B', 'C' ; 1, 1, 1; 2, 2, 2 };
b = {'C', 'D'; 3, 3; 4, 4};

%# transpose rows/columns
a = a'; b = b';

%# get all key values, and convert them to indices starting at 1
[allKeys,~,ind] = unique( [a(:,1);b(:,1)] );
indA = ind(1:size(a,1));
indB = ind(size(a,1)+1:end);

%# merge the two datasets (key,value1,value2)
c = cell(numel(allKeys), size(a,2)+size(b,2)-1);
c(:) = {NaN};                         %# fill with NaNs
c(:,1) = allKeys;                     %# available keys from both
c(indA,2:size(a,2)) = a(:,2:end);     %# insert 1st dataset values
c(indB,size(a,2)+1:end) = b(:,2:end); %# insert 2nd dataset values

Вот результат (транспонированный для соответствия исходной ориентации):

>> c'
ans = 
    'A'      'B'      'C'    'D'  
    [  1]    [  1]    [1]    [NaN]
    [  2]    [  2]    [2]    [NaN]
    [NaN]    [NaN]    [3]    [  3]
    [NaN]    [NaN]    [4]    [  4]

Также вот решение с использованиемDATASET класс из панели инструментов статистики:

aa = dataset([cell2mat(a(2:end,:)) a(1,:)])
bb = dataset([cell2mat(b(2:end,:)) b(1,:)])
cc = join(aa,bb, 'Keys',{'C'}, 'type','fullouter', 'MergeKeys',true)

с

cc = 
    A      B      C    D  
      1      1    1    NaN
      2      2    2    NaN
    NaN    NaN    3      3
    NaN    NaN    4      4
3

ертировать их в массивы наборов данных для этой цели), вы можете сделать следующее:

>> d1
d1 = 
    A    B    C
    1    1    1
    2    2    2
>> d2
d2 = 
    C    D
    3    3
    4    4
>> join(d1,d2,'Keys','C','type','outer','mergekeys',true)
ans = 
    A      B      C    D  
      1      1    1    NaN
      2      2    2    NaN
    NaN    NaN    3      3
    NaN    NaN    4      4

Похожие вопросы