将所有数据保持在 "rollmean" 输出附近

Keeping all data around "rollmean" output

我最近发现 rollmean 会为我提供围绕矩阵中某个数字的移动平均线。我遇到的问题是我的矩阵缩小了,并且在执行函数时我也丢失了行名。例如,矩阵 MA.test 是行中每天的数量(A = 周一,B = 周二,等等):

   > 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. 将这些行保留在输出中
  3. 我丢失了行名 - 对于这个小例子来说足够简单,但我的真实数据集包含 +100 行,这些行名是日期;我如何在输出中保留原始列名?

我想要的最终输出如下所示:

> 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

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

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

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

但是如果您的实际数据以日期作为行名,那么您可以只使用 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)