【问题标题】:Formatting data from an excel sheet in MATLAB在 MATLAB 中格式化 Excel 工作表中的数据
【发布时间】:2017-11-09 18:47:55
【问题描述】:

我使用命令 xlsread 从 excel 文件导入数据。数据如下所示:

我想格式化这些数据,使输出看起来像:

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

在 excel 中,我会使用数据透视表。 MATLAB 中是否有等价物,或者我将如何开始编写代码? reshape 是这里的选项吗?

【问题讨论】:

    标签: matlab matrix format pivot-table


    【解决方案1】:

    我假设你是文件中的reading your data,如下所示:

    data = xlsread('your_file.xls');
    

    这会为您提供一个包含数据的数字矩阵。然后,您可以通过使用unique 解析第一列和最后一列来重新组织它,然后将结果用作accumarray 的索引以收集中心列中的数据。然后你只需添加行和列标签:

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

    结果,对于您上面的示例数据:

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

    如果您有重复的条目(即具有相同日期和标识符的条目),以上将默认将它们相加。如果您希望它做其他事情,您可以提供 function handleaccumarray。例如:

    A = accumarray([rowIndex colIndex], data(:, 2), [], @mean);      % Averages them
    A = accumarray([rowIndex colIndex], data(:, 2), [], @(x) x(1));  % Keeps the first entry
    

    【讨论】:

    • 这个答案太棒了。我对这个问题还有一个额外的问题(不确定我是否会为此提出一个新问题)。如果有重复怎么办?假设有两个值为 100 的 20160101 值。您的代码将在输出中构建这两个值的总和(因此它将是 20160101 200 80 200)。理想情况下,它会保留 100。
    • @Joe:我添加了关于如何处理重复条目的说明。
    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 2023-03-21
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多