How can I insert data into rows without looping and logical indexing?

6 ビュー (過去 30 日間)
Rookie Programmer
Rookie Programmer 2025 年 1 月 15 日
コメント済み: Cris LaPierre 2025 年 1 月 15 日
I have two tables. table1 is 10*5 and table2 is 5*10.
table1 = table;
table1.var1 = [1; 1; 3; 3; 6; 1; 1; 3; 3; 6];
table1.var2 = [1; 2; 2; 3; 6; 1; 2; 2; 3; 6];
table1.var3 = [0; 2; 3; 4; 6; 0; 2; 3; 4; 6];
table1.var4 = [0; 2; 1; 5; 6; 0; 2; 1; 5; 6];
table1.var5 = [0; 2; 8; 7; 6; 0; 2; 8; 7; 6];
table2 = table;
table2.var1 = [1; 1; 3; 4; 5];
table2.var2 = [1; 2; 2; 5; 5];
table2.var3 = [1; 3; 3; 4; 5];
table2.var4 = [1; 2; 3; 4; 5];
table2.var5 = [1; 2; 4; 4; 5];
table2.var6 = [1; 8; 3; 4; 5];
table2.var7 = [1; 9; 3; 4; 5];
table2.var8 = [1; 7; 3; 4; 5];
table2.var9 = [1; 2; 3; 4; 5];
table2.var10 = [0; 1; 2; 3; 4];
test = table2(ismember(...
[table2.var1, table2.var2],...
[table1.var1, table1.var2], 'rows'), :);
How can I take var7 and var8 from test and input them in the matching rows from table1?
the output should look something like:
table1.var1 = [1; 1; 3; 3; 6; 1; 1; 3; 3; 6];
table1.var2 = [1; 2; 2; 3; 6; 1; 2; 2; 3; 6];
table1.var3 = [0; 2; 3; 4; 6; 0; 2; 3; 4; 6];
table1.var4 = [0; 2; 1; 5; 6; 0; 2; 1; 5; 6];
table1.var5 = [0; 2; 8; 7; 6; 0; 2; 8; 7; 6];
table1.var6 = [1; 9; 3; 0; 0; 1; 9; 3; 0; 0];
table1.var7 = [1; 7; 3; 0; 0; 1; 7; 3; 0; 0];
I can complete this with looping and logicaly indexing but would like to optimze for speed. Is there a faster way?
Can I directly insert table2.var7 and table2.var8 into table1 at every row were [table2.var1, table2.var] are the same rows of [table1.var1, table1.var2]? If so, how?

採用された回答

Voss
Voss 2025 年 1 月 15 日
% your tables:
table1 = table;
table1.var1 = [1; 1; 3; 3; 6; 1; 1; 3; 3; 6];
table1.var2 = [1; 2; 2; 3; 6; 1; 2; 2; 3; 6];
table1.var3 = [0; 2; 3; 4; 6; 0; 2; 3; 4; 6];
table1.var4 = [0; 2; 1; 5; 6; 0; 2; 1; 5; 6];
table1.var5 = [0; 2; 8; 7; 6; 0; 2; 8; 7; 6];
table2 = table;
table2.var1 = [1; 1; 3; 4; 5];
table2.var2 = [1; 2; 2; 5; 5];
table2.var3 = [1; 3; 3; 4; 5];
table2.var4 = [1; 2; 3; 4; 5];
table2.var5 = [1; 2; 4; 4; 5];
table2.var6 = [1; 8; 3; 4; 5];
table2.var7 = [1; 9; 3; 4; 5];
table2.var8 = [1; 7; 3; 4; 5];
table2.var9 = [1; 2; 3; 4; 5];
table2.var10 = [0; 1; 2; 3; 4];
% augment table1 with values of var6-var10 from rows of table2 where var1 and var2 match table1:
vars_to_check = "var"+[1 2];
vars_to_add = "var"+(6:10);
table1{:,vars_to_add} = 0;
[ism,idx] = ismember(table1(:,vars_to_check),table2(:,vars_to_check),'rows');
table1(ism,vars_to_add) = table2(idx(ism),vars_to_add)
table1 = 10x10 table
var1 var2 var3 var4 var5 var6 var7 var8 var9 var10 ____ ____ ____ ____ ____ ____ ____ ____ ____ _____ 1 1 0 0 0 1 1 1 1 0 1 2 2 2 2 8 9 7 2 1 3 2 3 1 8 3 3 3 3 2 3 3 4 5 7 0 0 0 0 0 6 6 6 6 6 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 1 2 2 2 2 8 9 7 2 1 3 2 3 1 8 3 3 3 3 2 3 3 4 5 7 0 0 0 0 0 6 6 6 6 6 0 0 0 0 0
  1 件のコメント
Cris LaPierre
Cris LaPierre 2025 年 1 月 15 日
Came up with a similar answer.
table1 = table;
table1.var1 = [1; 1; 3; 3; 6; 1; 1; 3; 3; 6];
table1.var2 = [1; 2; 2; 3; 6; 1; 2; 2; 3; 6];
table1.var3 = [0; 2; 3; 4; 6; 0; 2; 3; 4; 6];
table1.var4 = [0; 2; 1; 5; 6; 0; 2; 1; 5; 6];
table1.var5 = [0; 2; 8; 7; 6; 0; 2; 8; 7; 6];
table2 = table;
table2.var1 = [1; 1; 3; 4; 5];
table2.var2 = [1; 2; 2; 5; 5];
table2.var3 = [1; 3; 3; 4; 5];
table2.var4 = [1; 2; 3; 4; 5];
table2.var5 = [1; 2; 4; 4; 5];
table2.var6 = [1; 8; 3; 4; 5];
table2.var7 = [1; 9; 3; 4; 5];
table2.var8 = [1; 7; 3; 4; 5];
table2.var9 = [1; 2; 3; 4; 5];
table2.var10 = [0; 1; 2; 3; 4];
[lia,locb] = ismember([table1.var1, table1.var2],[table2.var1, table2.var2], 'rows');
table1(lia,{'var6','var7'}) = table2(locb(lia),{'var7','var8'})
Warning: The new variables being added to the table have fewer rows than the table. They have been extended with rows containing default values.
table1 = 10x7 table
var1 var2 var3 var4 var5 var6 var7 ____ ____ ____ ____ ____ ____ ____ 1 1 0 0 0 1 1 1 2 2 2 2 9 7 3 2 3 1 8 3 3 3 3 4 5 7 0 0 6 6 6 6 6 0 0 1 1 0 0 0 1 1 1 2 2 2 2 9 7 3 2 3 1 8 3 3 3 3 4 5 7 0 0 6 6 6 6 6 0 0

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeTables についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by