How can I concatenating 2 table

조회 수: 1 (최근 30일)
JAEMIN LEE
JAEMIN LEE 2018년 4월 24일
편집: Sterling Baird 2020년 9월 5일
left = table(['A0';'A1';'A2'],['B0';'B1';'B2'],... 'VariableNames',{'A' 'B'},... 'RowNames',{'K0' 'K1' 'K2'}); right = table(['C0';'C2';'C3'],['D0';'D2';'D3'],... 'VariableNames',{'C' 'D'},... 'RowNames',{'K0' 'K2' 'K3'});
Allname = union(left.Properties.RowNames, right.Properties.RowNames); result = zeros(length(Allname),size(left,2)+size(right,2)) * NaN; table_result= array2table(result); table_result.Properties.VariableNames = [left.Properties.VariableNames right.Properties.VariableNames]; table_result.Properties.RowNames=Allname; index_A =ismember(Allname, left.Properties.RowNames); index_B =ismember(Allname, right.Properties.RowNames); table_result(index_A,left.Properties.VariableNames) = A <- ERROR
I want to solve the problem. Give them a hand.

답변 (3개)

Ameer Hamza
Ameer Hamza 2018년 4월 24일
The column entries of the table must belong to the same class, therefore you can't use nan since it is double, whereas other elements are char arrays. In the following code, I have replaced it with char array 'nan'. Other than that, the following script will work as required.
left = table(['A0';'A1';'A2'],['B0';'B1';'B2'],...
'VariableNames',{'A' 'B'},...
'RowNames',{'K0' 'K1' 'K2'});
right = table(['C0';'C2';'C3'],['D0';'D2';'D3'],...
'VariableNames',{'C' 'D'},...
'RowNames',{'K0' 'K2' 'K3'});
Allname = union(left.Properties.RowNames, right.Properties.RowNames);
result = repmat({'nan'}, length(Allname), size(left,2)+size(right,2)); %zeros(length(Allname),size(left,2)+size(right,2)) * NaN;
table_result= array2table(result);
table_result.Properties.VariableNames = [left.Properties.VariableNames right.Properties.VariableNames];
table_result.Properties.RowNames=Allname;
table_result(left.Properties.RowNames,left.Properties.VariableNames) = table2cell(left);
table_result(right.Properties.RowNames,right.Properties.VariableNames) = table2cell(right);

Peter Perkins
Peter Perkins 2018년 4월 26일
You want outerjoin.

Sterling Baird
Sterling Baird 2020년 9월 5일
편집: Sterling Baird 2020년 9월 5일
outerjoin() works in the case you described (no common variable names between the tables), but when that's not the case, it will produce different behavior than what you seem to be going for. For example, with these two tables as inputs:
nrows = 3;
%define table columns
doubles = rand(nrows,1);
chars = repelem('a',nrows,1);
cells = repelem({rand(10)},nrows,1);
%make two tables
tbl1 = table(doubles,chars)
tbl2 = table(chars,cells)
>>
tbl1 =
3×2 table
doubles chars
________ _____
0.75906 a
0.017267 a
0.49258 a
tbl2 =
3×2 table
chars cells
_____ ______________
a {10×10 double}
a {10×10 double}
a {10×10 double}
outerjoin(tbl1,tbl2) will produce the following:
9×4 table
doubles chars_tbl1 chars_tbl2 cells
________ __________ __________ ______________
0.75906 a a {10×10 double}
0.75906 a a {10×10 double}
0.75906 a a {10×10 double}
0.017267 a a {10×10 double}
0.017267 a a {10×10 double}
0.017267 a a {10×10 double}
0.49258 a a {10×10 double}
0.49258 a a {10×10 double}
0.49258 a a {10×10 double}
As a simple modification to outerjoin, you can assign a list of temporary IDs that you remove at the end. You just need to makes sure that 'ids' (or whatever you choose) doesn't overlap with a variable in one of the tables.
t1names = tbl1.Properties.VariableNames;
t2names = tbl2.Properties.VariableNames;
sharednames = intersect(t1names,t2names);
tbl1.ids = (1:3).';
tbl2.ids = (4:6).';
tbloutjoin = outerjoin(tbl1,tbl2,'Key',['ids',sharednames],'MergeKeys',true);
removevars(tbloutjoin,'ids')
>>
doubles chars cells
_______ _____ ______________
0.24666 a { 0×0 double}
0.08822 a { 0×0 double}
0.47188 a { 0×0 double}
NaN a {10×10 double}
NaN a {10×10 double}
NaN a {10×10 double}
You may also consider using FEX: tblvertcat, which builds on outerjoin() following a similiar method as shown and supports 2+ tables: tblvertcat(tbl1,tbl2)
doubles chars cells
________ _____ ______________
0.75906 a { 0×0 double}
0.017267 a { 0×0 double}
0.49258 a { 0×0 double}
NaN a {10×10 double}
NaN a {10×10 double}
NaN a {10×10 double}

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by