1

我有一个与最近提出的另一个问题有关的问题。我将我的数据下载为csv.file. 然后我在 MATLAB 中对其进行格式化。我获得了格式化的数据,例如:

在此处输入图像描述

我想格式化数据,以便获得:

在此处输入图像描述

换句话说,日期应该在第一列,而两个标识符应该分别在前两行。

我尝试了@gnovice 提供的代码,但我在调整第二个标识符时遇到了问题。代码是:

A = accumarray([rowIndex colIndex], data(:, 4), [], @(x) x(1));
A = [NaN colVals; rowVals A];

其中data等于图(1)。

因此,我得到一个矩阵,A如:

 A = 
      NaN     1    2     3;
 20160101   100   80    90;
 20170101   150   90   200;

如何以照顾第二个标识符的方式调整我的代码并A变为:

 A = 
      NaN     1    2     3;
      NaN    10   10    15;
 20160101   100   80    90;
 20170101   150   90   200;
4

2 回答 2

2

您可以使用此代码

C = unique([identifier_1,identifier_2],'rows')

并相应地格式化您的数据

于 2017-12-04T07:54:55.490 回答
1

albusSimba的答案指向了正确的方向。您需要收集包含您的标识符的列(即data(:, [1 3])),将其传递给unique选项'rows'以查找唯一的行组合,然后捕获第三个输出以用作聚合的索引accumarray。然后,您的最终矩阵格式只需更改以考虑第二个标识符:

[rowVals, ~, rowIndex] = unique(data(:, 2));
[colVals, ~, colIndex] = unique(data(:, [1 3]), 'rows');
A = accumarray([rowIndex colIndex], data(:, 4), [], @(x) x(1));
A = [NaN colVals(:, 1).'; NaN colVals(:, 2).'; rowVals A];

以及您的样本数据的结果:

A =

         NaN           1           2           3
         NaN          10          10          15
    20160101         100          80         200
    20170101         150          90         200
于 2017-12-04T15:27:12.697 回答