从R中的时间序列中删除前导零

6jygbczu  于 2023-09-27  发布在  其他
关注(0)|答案(3)|浏览(98)

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

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)

我可以想象一个过程,通过对时间序列的子集进行多次测试来缩小前导零序列的范围,然后删除只有零的前导子集。然而,这将是一个繁琐的过程,这在计算方面可能是低效的。
有没有人知道一个已经存在的函数或过程来有效地做到这一点?

5fjcxozz

5fjcxozz1#

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

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]
agxfikkp

agxfikkp2#

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
>

希望能帮上忙!

xyhw6mcr

xyhw6mcr3#

一个简单的解决方案也是:

yourts <- c(0,1,1,0,1,2,3) 
yourts_wo_zeros <- yourts[which.max(yourts != 0):length(yourts)]

因为which.max取第一个最大值,在这种情况下为False, True, True, ...
我认为它的计算效率应该比cumsum稍微高一些,因为它避免了可能的大数字

相关问题