【问题标题】:Remove leading zeros from time series in R从 R 中的时间序列中删除前导零
【发布时间】:2014-02-17 09:25:51
【问题描述】:

我有以下模式的时间序列,我想知道是否有人可以分享一个聪明的技巧来删除前导零。我要避免的原因是它可能对预测模型的选择产生负面影响。

时间序列示例:

TimeSeries <- ts(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                   0, 0, 0, 0, 0, 0, 9, 10, 10, 16, 7, 13, 0, 9, 1, 
                   11, 2, 11, 3, 11, 4, 1, 20, 13, 18, 19, 16, 16, 16, 
                   15, 14, 27, 24, 35, 8, 18, 21, 20, 19, 22, 18, 21
),start=c(2001,6),frequency=12)

我可以想象一个过程,通过对时间序列的子集执行多次测试来缩小前导零序列的范围,然后删除仅包含零的前导子集。然而,这将是一个繁琐的过程,在计算方面可能效率低下。

有人知道已经存在的功能或程序可以有效地做到这一点吗?

【问题讨论】:

    标签: r time-series forecasting


    【解决方案1】:

    这只会删除前导零并保留其他零:

    TimeSeries[cumsum(TimeSeries)!=0]
    #[1]  9 10 10 16  7 13  0  9  1 11  2 11  3 11  4  1 20 13 18 19 16 16 16 15 14 27 24 35  8 18 21 20 19 22 18 21
    

    为什么会这样? cumsum 的输出是:

    cumsum(TimeSeries)
     [1]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   9  19  29  45  52  65  65  74  75
    [33]  86  88  99 102 113 117 118 138 151 169 188 204 220 236 251 265 292 316 351 359 377 398 418 418 437 459 477 498
    

    因此,只有在只有零的情况下,结果才等于零。如果时间序列的中途某处为零,则 cumsum 不会改变但不会为零。

    如果时间序列中有负值,您可以使用:

    TimeSeries[cumsum(abs(TimeSeries))!=0]
    

    【讨论】:

    • 请注意,这仅在 TimeSeries 为非负数时才有效(可靠)。如果TimeSeries &lt;- c(0, 1, -1),则失败。如果 TimeSeries 确实是非负数,它当然比 min(which(TimeSeries!=0)) 的解决方案更快。
    • 此外,如果您在数据框 df 上运行此操作,其中 column=TimeSeries,您可以运行 df[cumsum(df$TimesSeries),] 以返回没有前导零的数据框,或运行 df$TimeSeries[cumsum(df$TimeSeries)]] 仅返回没有前导零。
    【解决方案2】:

    TimeSeries[TimeSeries != 0]... 对我有用,但可能是更好的方法:

    > TimeSeries <- ts(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                       0, 0, 0, 0, 0, 0, 9, 10, 10, 16, 7, 13, 0, 9, 1, 
                       11, 2, 11, 3, 11, 4, 1, 20, 13, 18, 19, 16, 16, 16, 
                       15, 14, 27, 24, 35, 8, 18, 21, 20, 19, 22, 18, 21
    ),start=c(2001,6),frequency=12)
    > TimeSeries[TimeSeries != 0]
     [1]  9 10 10 16  7 13  9  1 11  2 11  3 11  4  1 20 13 18 19 16 16 16 15 14 27
    [26] 24 35  8 18 21 20 19 22 18 21
    >
    

    希望有帮助!

    【讨论】:

    • 这将删除时间序列中的所有zeros。因此,如果说在最后一个位置之前包含零,则此代码也会删除它。因此,它并不严格专注于删除前导零,而是删除所有零。
    • 你的例子。只有前导零,但我同意@Roland 的解决方案更好,即使没有给出解释
    • 确实如此。我已经在@Roland 的解决方案中添加了为什么这有效的解释。一旦我看到他的代码,就很容易理解了。
    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    相关资源
    最近更新 更多