rollmean 分组 data.table returns 合乎逻辑

rollmean with grouped data.table returns a logical

我在分组数据时尝试在 data.table 中使用包 zoo 中的 rollmean。

当所有组都有足够的数据时它工作正常:

library(data.table)
dt = data.table(x=rep(c("a","b"),10),y=rnorm(20))

dt[,.(ma=rollmean(y, k = 7, fill=NA,align="right")), by = .(x)]

但是当其中一组的数据太少时,returns会出错


dt2 = data.table(x=rep(c("c"),1),y=rnorm(1))

dt3=rbind(dt,dt2)
dt3[,.(ma=rollmean(y, k = 7, fill=NA,align="right")), by = .(x)]

错误信息如下:

Column 1 of result for group 3 is type 'logical' but expecting type 'double'. Column types must be consistent for each group.

这似乎是因为 rollmean returns 在没有足够数据时是合乎逻辑的(TRUENA 的混合) 鉴于我的数据总是积极的,我使用以下技巧使我的代码 运行 anyway

dt4=dt3[,.(ma=rollmean(y, k = 7, fill=-1,align="right")), by = .(x)]
dt4[ma==-1,ma:=NA]
dt4

有proper/better方法吗?

我们可以使用 NA_real_ 而不是 NA 因为默认情况下会是 NA_logical_

dt3[x == 'c', class(rollmean(y, k = 7, fill = NA, align = 'right'))] 
#[1] "logical"

fill 中使用 NA_real_,它可以正常工作

dt3[,.(ma=rollmean(y, k = 7, fill=NA_real_,align="right")), by = .(x)]
#    x          ma
# 1: a          NA
# 2: a          NA
# 3: a          NA
# 4: a          NA
# 5: a          NA
# 6: a          NA
# 7: a  0.19653855
# 8: a -0.05506344
# 9: a -0.17022022
#10: a -0.28731762
#11: b          NA
#12: b          NA
#13: b          NA
#14: b          NA
#15: b          NA
#16: b          NA
#17: b  0.02117906
#18: b -0.07079598
#19: b -0.05393943
#20: b  0.04511924
#21: c          NA
    x          ma

在其他组中,它也在创建 NA,但不同之处在于,当存在非 NA 元素时,它会被强制转换为数字 NA