我正在尝试在Matlab中使用相对较新的数据类型table
。我有许多变量,每个变量都包含一组参数(Rows
)的值。但是,每个变量的行(必然)不相等。我想将变量连接在一起,所以结果都显示在一个表中。例如,我想将它们加在一起:(并排绘制以节省空间)
Var_A Var_B
________ _______
a 0.36744 b 0.88517
b 0.98798 c 0.91329
c 0.037739 d 0.79618
是否可以加入这两个表? 以下是我正在尝试做的一个例子:
A = table(rand(3,1),'VariableNames',{'Var_A'},'RowNames',{'a','b','c'})
B = table(rand(3,1),'VariableNames',{'Var_B'},'RowNames',{'b','c','d'})
try
C = join(A,B)
catch e
disp(e.identifier)
disp(e.message)
end
这导致:
MATLAB:table:join:CantInferKey
Cannot find a common table variable to use as a key variable.
好吧,也许join
可能不适合这个 - outerjoin
怎么办?它的文档听起来很有希望:
外部联接包括A和B之间匹配的行,以及来自A或B的不匹配行,所有行都与关键变量有关。 C包含A和B的所有变量,包括关键变量。
好吧,outerjoin
显然不能用于带有行名的表!这是我发现的最接近我想要的东西,但似乎在某种程度上反对table
数据结构的想法:
AA = table({'a';'b';'c'},rand(3,1));
AA.Properties.VariableNames = {'param','Var_A'}
BB = table({'b';'c';'d'},rand(3,1));
BB.Properties.VariableNames = {'param','Var_B'}
CC = outerjoin(AA,BB,'Keys',1,'MergeKeys',true)
这导致
param Var_A Var_B
_____ _______ _______
'a' 0.10676 NaN
'b' 0.65376 0.77905
'c' 0.49417 0.71504
'd' NaN 0.90372
即,row
只是作为单独的变量存储。这意味着无法使用“{1}}等<逻辑”表示法对其进行索引。
所以这可以用以下方法解决:
CC{'a',:}
最终导致:
CCC = CC(:,2:end);
CCC.Properties.RowNames = CC{:,1}
但这真的是最好的办法吗? Matlab很奇怪。
答案 0 :(得分:1)
必须有更好的方法来做到这一点,但这是另一种选择:
clear;
%// Create two tables to play with.
tableA = table([.5; .6; .7 ],'variablenames',{'varA'},'rowname',{'a','b','c'});
tableB = table([.55; .62; .68],'variablenames',{'varB'},'rowname',{'b','c','d'});
%// Lets add rows to tableA so that it has the same rows as tableB
%// First, get the set difference of tableB rows and tableA rows
%// Then, make a new table with those rows and NaN for data.
%// Finally, concatenate tableA with the new table
tableAnewRows=setdiff(tableB.Properties.RowNames,tableA.Properties.RowNames);
tableAadd=table( nan(length(tableAnewRows),1) ,'variablenames',{'varA'},'rownames',tableAnewRows);
tableA=[tableA;tableAadd];
%// Lets add rows to tableB so that it has the same rows as tableA
tableBnewRows=setdiff(tableA.Properties.RowNames,tableB.Properties.RowNames);
tableBadd=table( nan(length(tableBnewRows),1) ,'variablenames',{'varB'},'rownames',tableBnewRows);
tableB=[tableB;tableBadd];
%// Form tableC from tableA and tableB. Could also use join().
tableC=[tableA tableB];