在 R 中具有可变宽度的数据 table 中使用 Rollapply
Using Rollapply in a data table with a variable width in R
我想使用 rollapply 计算 R 中数据 table 的移动平均值。数据 table 中的每一行都是一个月,我想对过去 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 行开始,因为这是我设置宽度的方式。
有没有办法在数据 table 中做到这一点?谢谢
对于滚动平均值和总和,zoo
(rollmean
和 rollsum
)中有专门的函数。如果要将函数应用于至少 24 个数据点,可以使用仅在 rollapply
中可用的 partial
参数。另外 rollapply(...., align = 'right')
与 rollapplyr
相同。你可以试试:
library(data.table)
library(zoo)
dt[, MovAvg := rollapplyr(Points,36,mean,na.rm = TRUE, partial = 24,fill = NA),username]
我想使用 rollapply 计算 R 中数据 table 的移动平均值。数据 table 中的每一行都是一个月,我想对过去 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 行开始,因为这是我设置宽度的方式。
有没有办法在数据 table 中做到这一点?谢谢
对于滚动平均值和总和,zoo
(rollmean
和 rollsum
)中有专门的函数。如果要将函数应用于至少 24 个数据点,可以使用仅在 rollapply
中可用的 partial
参数。另外 rollapply(...., align = 'right')
与 rollapplyr
相同。你可以试试:
library(data.table)
library(zoo)
dt[, MovAvg := rollapplyr(Points,36,mean,na.rm = TRUE, partial = 24,fill = NA),username]