【问题标题】:Accumulate observations based on date stamp in MATLAB在 MATLAB 中根据日期戳累积观察值
【发布时间】:2015-05-21 19:04:58
【问题描述】:

如果我有以下数据集

A =

20061201         100
20061201          10
20061201           9
20061202          15
20061202          50
20061204          40
20061204          16
20061204          12

column 1 有日期,而columns 2 有相应的观察结果 其中. 对应于没有观察。

我希望输出类似于

row 1: 20061201  100 10 9 
row 2: 20061202   15 50 .
row 3: 20061204   40 16 12  

我该怎么做,有什么提示吗?

【问题讨论】:

  • 有什么理由不想使用 reshape?
  • 它可能需要相同大小的向量,因为一个日期可以说是 10 个观察值,而其他日期或多或少。
  • 如何指定每个日期对应的观察次数?您的问题不清楚
  • @Jessi - 这仍然不能解释为什么你不能使用reshape。我不明白你的问题陈述。
  • 那可能是我用错了,你能指教吗?

标签: matlab vector reshape


【解决方案1】:

使用uniqueaccumarray

[uVals,~,subs] = unique(A(:,1));
out = [num2cell(uVals), accumarray(subs,A(:,2),[],@(x) {x.'})]

您的示例输入:

>> A

A =

20061201         100
20061201          10
20061201           9
20061202          15
20061202          50
20061204          40
20061204          16
20061204          12

结果:

>> out

out =  

[20061201]    [1x3 double]
[20061202]    [1x2 double]
[20061204]    [1x3 double]

我使用cell-Array 作为输出。在这种情况下,您不必将. 填充到不足的行。如果你想显示一个特定的单元格,你可以像这样使用{} 而不是()..

>> out{1,2}

ans =

100    10     9

>> out{2,2}

ans =

15    50

这是一种方法(基于this 答案),如果您坚持获取矩阵而不是单元格数组,则可以使用。我还建议,您使用 NaN(Not-a-Number) 填充而不是 .

[uVals,~,subs] = unique(A(:,1));
valC = accumarray(subs,A(:,2),[],@(x) {x.'});
maxSize = max(cellfun(@numel,valC));
valMat = cellfun(@(x) [x nan(1,maxSize-numel(x))],valC,'uni',0);
valMat = vertcat(valMat{:});
out = [uVals, valMat];

样本输入的结果:

>> out

out =

20061201         100          10           9
20061202          15          50         NaN
20061204          40          16          12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多