【问题标题】:Using rollmean when there are missing values (NA)有缺失值时使用 rollmean (NA)
【发布时间】:2013-07-19 20:31:53
【问题描述】:

我有一个数据集,其中有几个NA。我采用滚动平均值并期望当窗口中没有NA 时,滚动平均值应该产生一个数字,而不是NA,但是,zoo 中的rollmeanr 似乎没有这样做。示例:

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

【问题讨论】:

  • 来自我的帮助文件:The default method of ‘rollmean’ does not handle inputs that contain ‘NA’s. In such cases, use ‘rollapply’ instead.
  • 是的,我看到了。我假设它只是不允许您跳过 NA,因为 rollapply 允许您通过 na.rm=TRUE。是否应该在有 NA 时读取它会中断?

标签: r xts zoo


【解决方案1】:

来自?rollmean

‘rollmean’的默认方法不 处理包含“NA”的输入。在这种情况下,使用“rollapply” 而是。

【讨论】:

  • 是的,我看到了。我假设它只是不允许您跳过 NA,因为 rollapply 允许您通过 na.rm=TRUE。是否应该在有 NA 时读取它会中断?
  • 查看zoo:::rollmean.zoo 并注意na.rm 没有在任何地方传递。
  • 是的,我不是这么说的。我认为na.rm=FALSE 将是默认值,您不能在rollmean 中修改它,而您可以在rollapply 中修改它。这就是我理解帮助文件所说的内容。显然我错了。
  • 您可以随时使用“过滤器”功能。 NA 没有问题,而且速度非常快
  • @GeorgeSteblovsky 是的,as.zoo(apply(z, 2, function(x) filter(x, rep(1/3, 3), sides=1))) 在这种情况下大约快 9 倍。
【解决方案2】:

使用“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”。

【讨论】:

  • 或等效:rollapplyr(z, 3, mean, na.rm = TRUE, by = 1, partial = TRUE, fill = NA)
【解决方案3】:

为了使其完整,rollsum 也无法处理包含“NA”的输入。在这种情况下,请改用“rollapply”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-15
    • 2020-08-11
    • 2018-06-09
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多