2013-07-20 37 views
2

我有一个数据集,其中有几个NA。我采取滚动的意思,并期望当窗口中没有NA,滚动意味着应该产生一个数字,而不是NA,但rollmeanrzoo似乎并没有这样做。例如:缺少值时使用滚动(NA)

require(zoo) 
z = zoo(cbind(a=0:10, b=c(NA,10:1), c=sample(1:11,11)), 1:11) 
rollmeanr(z, k=3, fill=NA) 
    a b  c 
1 NA NA  NA 
2 NA NA  NA 
3 1 NA 3.333333 
4 2 NA 4.666667 
5 3 NA 4.000000 
6 4 NA 6.333333 
7 5 NA 7.000000 
8 6 NA 9.333333 
9 7 NA 8.333333 
10 8 NA 8.666667 
11 9 NA 5.666667 

rollapply(z, width=3, FUN=mean, by=1, by.column=TRUE, fill=NA, align="right") 
    a b  c 
1 NA NA  NA 
2 NA NA  NA 
3 1 NA 3.333333 
4 2 9 4.666667 
5 3 8 4.000000 
6 4 7 6.333333 
7 5 6 7.000000 
8 6 5 9.333333 
9 7 4 8.333333 
10 8 3 8.666667 
11 9 2 5.666667 

我期望这两个调用产生相同的结果。请给出意见。一些会话信息:

sessionInfo() 
R version 3.0.1 (2013-05-16) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] zoo_1.7-10 

loaded via a namespace (and not attached): 
[1] grid_3.0.1  lattice_0.20-15 
+0

从我的帮助文件中:''rollmean'的默认方法不包含'NA'的 句柄输入。在这种情况下,请使用'rollapply' 。' – dickoa

+0

是的,我看到了。我认为它不会允许你跳过NA,因为rollapply允许你传递na.rm = TRUE。如果在有NA的情况下它被打破了,那么它应该被读取吗 – Alex

回答

9

?rollmean

“rollmean”的默认方法不 包含“NA的手柄输入。在这种情况下,请使用'rollapply' 。

+0

是的,我看到了。我认为它不会允许你跳过NA,因为rollapply允许你传递na.rm = TRUE。如果在有NA的情况下它被打破了,那么它应该被读取吗 – Alex

+0

看看'动物园::: rollmean.zoo',注意'na.rm'没有传到任何地方。 – GSee

+0

你好,那不是我所说的。我认为'na.rm = FALSE'是默认的,你不能在'rollmean'中修改它,因为你可以在'rollapply'中修改它。这就是我理解帮助文件的意思。显然我错了。 – Alex

1

使用'partial = TRUE'选项。该选项可以使用NA计算数据。

> rollapply(z, width=3, FUN=function(x) mean(x, na.rm=TRUE), by=1, by.column=TRUE, partial=TRUE, fill=NA, align="right") 

    a b  c 
1 0.0 NaN 1.000000 
2 0.5 10.0 5.500000 
3 1.0 9.5 4.333333 
4 2.0 9.0 6.666667 
5 3.0 8.0 4.666667 
6 4.0 7.0 6.000000 
7 5.0 6.0 7.000000 
8 6.0 5.0 8.666667 
9 7.0 4.0 8.333333 
10 8.0 3.0 7.000000 
11 9.0 2.0 5.000000 

如果要将第一行中的'NaN'更改为'0',请将'fill = NA'修改为'fill = 0'。

+1

或等同地说:'rollapplyr(z,3,mean,na.rm = TRUE,by = 1,partial = TRUE,fill = NA)' –

0

为了使它完成,rollsum不能处理包含'NA'的输入。在这种情况下,请使用'rollapply'。