我使用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行。它正在认识到这一事实,但仍未输出我想要的结果。