我还没有找到关于如何通过因子变量计算数据框中的移动平均线的令人满意的答案。此外,我的问题是整个因子水平为NA(一个国家或个人没有数据)和非领先NA的情况(最后一次观察缺失)。
考虑:
value <- c(rep(NA,4),1,2,3,NA,5:8)
factor <- c(rep("a",4), rep("b",4),rep("c",4))
Data <- as.data.frame(cbind(value,factor))
我希望在3次观测中得到(右对齐)移动平均线。对于软件包感到抱歉,但在我看来,这应该与ddply函数一起使用:
library(TTR) # for moving averages
library(plyr) # for ddply
Data <- ddply(Data,"factor",MAvalue = SMA(value, n=3))
结果应如下所示:
value factor MAvalue
NA a NA
NA a NA
NA a NA
NA a NA # this factor has no data
1 b NA
2 b NA
3 b 2
NA b NA # this factor is missing the last observation
5 c NA
6 c NA
7 c 6
8 c 7 # this factor has complete information
任何帮助将不胜感激!
答案 0 :(得分:3)
使用NA数据:
library(zoo)
library(data.table)
setDT(Data)
Data[, MA.value := rollmeanr(value, 3, na.pad = TRUE), by = factor]
答案 1 :(得分:2)
使用cbind
时,它会将所有数据转换为字符。试试这个。
value <- c(1:12)
factor <- c(rep("a",6), rep("b",6))
Data <- data.frame(factor = factor,
value = value)
ddply(Data, .(factor), transform, MAValue = SMA(value, 3))
factor value MAValue
1 a 1 NA
2 a 2 NA
3 a 3 2
4 a 4 3
5 a 5 4
6 a 6 5
7 b 7 NA
8 b 8 NA
9 b 9 8
10 b 10 9
11 b 11 10
12 b 12 11