在Matlab中连接具有不相等行的表

时间:2016-02-20 10:45:52

标签: matlab

我正在尝试在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很奇怪。

1 个答案:

答案 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];