2016-03-03 49 views
1

我最近发现rollmean将为我提供矩阵中某个数字的移动平均值。我遇到的问题是我的矩阵缩小了,而且在执行函数时我也失去了行名。例如作为这类基质MA.test是每天量的行(A =星期一,B =星期二等):保留“rollmean”输出的所有数据

> 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行,这些行名称是日期;我如何将原始列名保留在输出中?

我期望的最终输出看上去就像这样:

> 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 

衷心感谢你对所提供的任何解决方案!

回答

0

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

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

但是,如果您的实际数据具有日期作为行名称,那么您可以使用动物园(或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) 
+0

请注意,这工作:'图书馆(动物园); as.data.frame(rollmean(zoo(MA.Test,rownames(MA.Test)),7))''fill'= NA'。它假定rownames是按升序排列的。 –

+0

嗨约书亚,我有日期作为行名,但是我在数据操作过程中使用了Lubridate - str()表示它们为POSIXct。这会影响你列出的方法吗?谢谢 – Qaribbean

+0

@Qaribbean:行名不能是'POSIXct',它们总是字符。如果行名具有日期和时间,那么只需在我的答案中使用'as.POSIXct'而不是'as.Date'。 –