【发布时间】:2020-07-29 03:05:46
【问题描述】:
我想使用 rollapply 在 R 中的数据表中计算移动平均值。数据表中的每一行都是一个月,我想平均过去 36 个月,但如果是这样的话,将低至 24所有可用的。
以下代码计算“点”的 36 个月移动平均值,忽略每个“用户名”的 NA。然后计算有多少非 NA,如果小于 24,则将移动平均值设置为 NA。
dt[,MovAvg:=rollapply(Points,width=36,FUN=mean,fill=NA,alight="right",na.rm=TRUE),by="username"]
dt[,NACount:=rollapply(Points,width=36,FUN=function(x) sum(!is.na(x)),fill=NA,alight="right"),by="username"]
dt[,MovAvg:=ifelse(NACount>=24,MovAvg,NA)]
除了在第 1-35 行的开头之外,此代码运行良好。只要至少有 24 个数据点,我希望它使用可用数据计算移动平均值。 Rollapply 从第 36 行开始,因为这是我设置宽度的方式。
有没有办法在数据表中做到这一点?谢谢
【问题讨论】:
-
(1) 如果使用
data.table,强烈推荐data.table::fifelse代替基础ifelse; (2) 对于这样的函数,通常在其他地方定义这些函数并使用 named 函数来代替使用 anonymous 内联函数来提高可读性(和可维护性)。 (3) 如果我们对数据的样子有任何了解会更容易提供帮助,请考虑使用类似dput(head(x,n=40))以及预期输出给定样本数据. -
还有(4),请检查错别字,例如
alightvsalign...(或者alight=是align=的同义词吗?) -
是的,很抱歉我忽略了这一点。它应该是“对齐”而不是亮