【问题标题】:error with zoo package, data too long?zoo包出错,数据太长?
【发布时间】:2012-04-11 18:54:25
【问题描述】:

我想生成一个具有指定 bin 宽度的运行平均值的新列,为此我使用了 zoo 包(rollmean 函数)。我的数据表由 100 万行组成,该函数适用于前 500,000 行,之后它是所有 NA 生成的,有什么想法我可能做错了吗?

library("zoo")

HB<-bin/2
n<-length(dataraw$S)
data<-dataraw[HB:(n-HB),]
sax<- rollmean (dataraw$S, bin)
data2<-cbind(data,sax)

我会很感激你能给我的任何帮助,我已经被这个困住了太久了。提前致谢。

【问题讨论】:

  • ?rollmean 说:“rollmean 的默认方法不处理包含 NA 的输入。在这种情况下,请改用 rollapply。”

标签: r zoo na


【解决方案1】:

您几乎可以肯定那里有一个 NA,然后通过rollmean() 传播。正如这个小实验所示,一百万个值本身不会造成麻烦:

R> library(zoo)
R> X <- zoo(rnorm(1e6), order.by=Sys.time()+seq(1,1e6)*1e-3)
R> Xrm <- rollmean(X, 63)
R> summary(cbind(X, Xrm))
     Index                             X                Xrm         
 Min.   :2012-04-11 13:57:28.9   Min.   :-5.1857   Min.   :-0.5843  
 1st Qu.:2012-04-11 14:01:38.9   1st Qu.:-0.6741   1st Qu.:-0.0866  
 Median :2012-04-11 14:05:48.9   Median :-0.0011   Median :-0.0013  
 Mean   :2012-04-11 14:05:48.9   Mean   :-0.0011   Mean   :-0.0011  
 3rd Qu.:2012-04-11 14:09:58.9   3rd Qu.: 0.6727   3rd Qu.: 0.0838  
 Max.   :2012-04-11 14:14:08.9   Max.   : 4.8914   Max.   : 0.5874  
                                                   NA's   :62       
R> 

这里唯一的 NA 是由于在开始时引入了初始滞后。

但是当我在 X 中引入一个单一的 NA 时,一切都崩溃了:

R> X[567890] <- NA
R> summary(cbind(X, rollmean(X, 63)))
     Index                             X            rollmean(X, 63) 
 Min.   :2012-04-11 13:57:28.9   Min.   :-5.18574   Min.   :-1      
 1st Qu.:2012-04-11 14:01:38.9   1st Qu.:-0.67413   1st Qu.: 0      
 Median :2012-04-11 14:05:48.9   Median :-0.00110   Median : 0      
 Mean   :2012-04-11 14:05:48.9   Mean   :-0.00109   Mean   : 0      
 3rd Qu.:2012-04-11 14:09:58.9   3rd Qu.: 0.67268   3rd Qu.: 0      
 Max.   :2012-04-11 14:14:08.9   Max.   : 4.89137   Max.   : 1      
                                 NA's   :1          NA's   :432173  
R>

我最终得到了 432k 的尾随 NA。

【讨论】:

  • 如果是这种情况,您应该查看rollapply。例如。 rollapply(dataraw$S, width = bin, FUN = mean, fill = NA) 可以处理向量中间的NA值。
  • 太棒了——如果它解决了你的问题,你应该考虑a)“赞成”答案(点击向上箭头)和b)“接受”答案(点击勾号)。
  • 我没有足够的“声望”来投票,所以标记它是...再次感谢。
猜你喜欢
  • 2015-12-03
  • 2011-12-29
  • 1970-01-01
  • 2012-11-25
  • 2023-03-20
  • 2012-01-29
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多