当列具有NA值时,使用ZOO滚动平均值

时间:2017-06-04 03:04:39

标签: r

我使用data.table和zoo计算了滚动平均值。

以下代码:我在包含NA行的artprice列上进行计算。

library(data.table)
library(zoo)
rollmean1 <- data.table(newdf)
rollmean2 <- (rollmean1)[, paste0('MA',126) := lapply(126, function(x) rollmeanr(artprice, x, fill = NA))][]

输出:

> head(rollmean2)
     spdate SP500close artprice     MA2      MA3 MA126
1: 19870330     289.20     83.6      NA       NA    NA
2: 19870331     291.70       NA 290.450       NA    NA
3: 19870401     292.39       NA 292.045 291.0967    NA
4: 19870402     293.63       NA 293.010 292.5733    NA
5: 19870403     300.41       NA 297.020 295.4767    NA
6: 19870406     301.95       NA 301.180 298.6633    NA

注意artprice列主要有NA值,但是,我想忽略它们并仍然运行滚动平均值。但是,我不希望我的artprice数据删除所有的NA,并且它不匹配日期列。

关于如何实现的任何想法? 我倾向于这样的东西,因为它认识到有NA值,但继续计算:(x [!is.na(x)])

rollmean2 <- (rollmean1)[, paste0('MA',126) := lapply(126, function(x) rollmeanr(artprice, (x[!is.na(x)]), fill = NA))][]

有任何见解。

编辑:更改了代码以使用rollapply。

> rollmean2 <- (rollmean1)[, paste0('MA',126) := lapply(126, rollapplyr, data=artprice, mean, rm.na = TRUE, Fill = NA)][]
Warning message:
In `[.data.table`((rollmean1), , `:=`(paste0("MA", 126), lapply(126,  :
  Supplied 7491 items to be assigned to 7616 items of column 'MA126' (recycled leaving remainder of 125 items).
> tail(rollmean2)
     spdate SP500close artprice MA126
1: 20170524    2404.39       NA    NA
2: 20170525    2415.07       NA    NA
3: 20170526    2415.82       NA    NA
4: 20170530    2412.91       NA    NA
5: 20170531    2411.80       NA    NA
6: 20170601    2430.06       NA    NA

它抛出了这条警告信息:

 Warning message:
    In `[.data.table`((rollmean1), , `:=`(paste0("MA", 126), lapply(126,  :
      Supplied 7491 items to be assigned to 7616 items of column 'MA126' 

数据框rollmean1有7616行

> nrow(rollmean1)
[1] 7616

输出表:

> nrow(rollmean2)
[1] 7616

因此,滚动计算将在MA126基础上执行。这意味着实际计算不能开始,直到126行在数据集的开头没有填充125行。它正在认识到这一事实,但仍未输出我想要的结果。

0 个答案:

没有答案