如何在MATLAB中从高到大的格式有效地转换具有复制的表?

时间:2016-09-27 15:33:21

标签: matlab pivot

我有一个高MATLAB table这样:

spam = 

   Data             cat1         cat2         time
__________          ___________  __________   ______    

  -0.41763          1            0            0
   0.11719          1            0            0
  ...               ...          ...          ...
  -0.16546          1            0            1   
  ...               ...          ...          ...
  -0.21763          1            0            2   
   0.31719          2            0            0 
  ...               ...          ...          ...
   0.58116          3            1            0 
  ...               ...          ...          ...

Data是双重格式,cat1(8个级别)和cat2(3个级别)是绝对的,time(3个级别)是序数的(但可以加倍)。每个cat1cat2级别的每个时间点都包含30个(技术性)重复项(上面用...表示)。

我希望在fitrm中使用这些数据,这要求它们采用宽格式。因此,我需要将Data列转换为三个单独的变量。

使用unstack我得到这样的内容:

spam = unstack(spam, 'Data', 'time')
Warning: Variable names were modified to make them valid MATLAB identifiers. 

spam = 
cat1       cat2        x0             x1         x2   
______    _________    ___________    _______    ________

1         0            -7.6605e-15     2.3168     0.45234
2         0             6.2172e-15     5.1661     24.89
3         1             8.8818e-16     56.697     40.441
4         1            -7.9936e-15    -22.741    -17.191
5         1            -1.4433e-15    -7.7803    -20.817
6         2             5.5511e-16     7.8535    -0.21172
7         2             5.3291e-15     13.658     5.8402
8         2             2.2204e-15     9.1739     13.814

显然,此结果不包括高表中的所有信息。 具体来说,重复没有被带到结果中。

accumarray的方式使用MATCH p = (:Blue)-[*]-(g:Green) WHERE all(n IN tail(nodes(p)) WHERE n:Green) OPTIONAL MATCH (g)--(g2:Green) WITH p, collect(g2) AS greens WHERE size(greens) <= 1 RETURN last(nodes(p)) 可能很有希望,但在我的情况下,手动执行一次性转换似乎更容易。

是否有人意识到更有效的方法?

1 个答案:

答案 0 :(得分:-1)

我现在意识到,也许最简单的方法是在高大的表格中添加额外的变量replication,然后使用unstack,如上所述。

示例(使用不同的数据,取自my answer here):

name = ['A' 'A' 'A' 'B' 'B' 'C' 'C' 'C' 'C' 'D' 'D' 'E' 'E' 'E']';
value = randn(14, 1);
rep = [1, 2, 3, 1, 2, 1, 2, 3, 4, 1, 2, 1, 2, 3];
T = table(name, value, rep);

T = 

name      value      rep
____    _________    ___

A         0.53767    1  
A          1.8339    2  
A         -2.2588    3  
B         0.86217    1  
B         0.31877    2  
C         -1.3077    1  
C        -0.43359    2  
C         0.34262    3  
C          3.5784    4  
D          2.7694    1  
D         -1.3499    2  
E          3.0349    1  
E          0.7254    2  
E       -0.063055    3  



pivotTable = unstack(T, 'value','name')

pivotTable = 

    rep       A          B          C           D           E    
    ___    _______    _______    ________    _______    _________

    1      0.53767    0.86217     -1.3077     2.7694       3.0349
    2       1.8339    0.31877    -0.43359    -1.3499       0.7254
    3      -2.2588        NaN     0.34262        NaN    -0.063055
    4          NaN        NaN      3.5784        NaN          NaN