【问题标题】:Using Rollapply in a data table with a variable width in R [duplicate]在R中具有可变宽度的数据表中使用Rollapply [重复]
【发布时间】: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),请检查错别字,例如alight vs align ...(或者alight=align=的同义词吗?)
  • 是的,很抱歉我忽略了这一点。它应该是“对齐”而不是亮

标签: r rollapply


【解决方案1】:

对于滚动平均值和求和,zoorollmeanrollsum)中有专门的函数。如果要将函数应用于至少 24 个数据点,可以使用 partial 参数,该参数仅在 rollapply 中可用。 rollapply(...., align = 'right') 也与 rollapplyr 相同。你可以试试:

library(data.table)
library(zoo)

dt[, MovAvg := rollapplyr(Points,36,mean,na.rm = TRUE, partial = 24,fill = NA),username]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 2016-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多