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

2 次查看(过去 30 天)
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 CenterFile Exchange 中查找有关 Tables 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by