保持所有数据围绕“rollmean”输出

时间:2016-03-03 09:39:45

标签: r zoo moving-average

我最近发现rollmean将为我提供矩阵中数字的移动平均值。我遇到的问题是我的矩阵缩小了,并且在执行函数时我也丢失了行名。例如,矩阵MA.test本身就是行中的每日数量(A = Mon,B = Tues等):

   > MA.Test
   a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t
A 49 21  6 27 34 49 21  6 27 34 49 21  6 27 34 49 21  6 27 34
B 35 23 37 47 45 35 23 37 47 45 35 23 37 47 45 35 23 37 47 45
C 40  0 20 10 19 40  0 20 10 19 40  0 20 10 19 40  0 20 10 19
D  8 46 22  3 28  8 46 22  3 28  8 46 22  3 28  8 46 22  3 28
E 30  7  1 42 39 30  7  1 42 39 30  7  1 42 39 30  7  1 42 39
F  9 16 32 14 33  9 16 32 14 33  9 16 32 14 33  9 16 32 14 33
G 48  5 13 15 11 48  5 13 15 11 48  5 13 15 11 48  5 13 15 11
H 12 38 36 18 24 12 38 36 18 24 12 38 36 18 24 12 38 36 18 24
I 43 26 17 44 25 43 26 17 44 25 43 26 17 44 25 43 26 17 44 25
J 41  2 29 31  4 41  2 29 31  4 41  2 29 31  4 41  2 29 31  4

当我将该功能平均应用于每一方3天时(将使用7,结合当天,我会使用rollmean(MA.Test,7)并标记此MA.Test.1并获得以下内容:

> MA.Test.1 = rollmean(MA.Test,7)
> MA.Test.1
      a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t
[1,] 31 17 19 23 30 31 17 19 23 30 31 17 19 23 30 31 17 19 23 30
[2,] 26 19 23 21 28 26 19 23 21 28 26 19 23 21 28 26 19 23 21 28
[3,] 27 20 20 21 26 27 20 20 21 26 27 20 20 21 26 27 20 20 21 26
[4,] 27 20 21 24 23 27 20 21 24 23 27 20 21 24 23 27 20 21 24 23

我的疑问有两个:

  1. 我知道输出以行D周围的MA开始,到行G结束,因为我没有行A / B / C或H / I / J的值,因为它们没有足够的周围数据;如何只用“NA”来保持输出中的这些行?

  2. 我正在丢失行名称 - 这个小例子很简单,但我的真实数据集包含+100行,这些行名称是日期;如何将原始列名保留在输出中?

  3. 我想要的最终输出看起来像这样:

    > MA.Test.1 = rollmean(MA.Test,7)
    > MA.Test.1
       a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t
    A NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
    B NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
    C NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
    D 31 17 19 23 30 31 17 19 23 30 31 17 19 23 30 31 17 19 23 30
    E 26 19 23 21 28 26 19 23 21 28 26 19 23 21 28 26 19 23 21 28
    F 27 20 20 21 26 27 20 20 21 26 27 20 20 21 26 27 20 20 21 26
    G 27 20 21 24 23 27 20 21 24 23 27 20 21 24 23 27 20 21 24 23
    H NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
    I NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
    J NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
    

    非常感谢您提供的任何解决方案!

1 个答案:

答案 0 :(得分:0)

使用fill=NA填充NA。然后,您可以将结果的rownames设置为输入的结果。

MA.Test.1 <- rollmean(MA.Test,7,fill=NA)
rownames(MA.Test.1) <- rownames(MA.Test)

但是如果你的实际数据有Dates作为行名,那么你可以使用zoo(或xts)。

library(xts)
ma <- MA.Test
rownames(ma) <- Sys.Date()-9:0
# zoo
z <- zoo(ma, as.Date(rownames(ma)))
z1 <- rollmean(z, 7, fill=NA)
# xts
x <- as.xts(ma)
x1 <- rollmean(x, 7, fill=NA)