[我试图在对数据进行分组时在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)]
但是当其中一个组的数据太少时,它将返回错误
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)]
这里是错误消息:
组3的结果的第1列为'逻辑'类型,但期望为'双'类型。每个组的列类型必须一致。
这似乎是因为rollmean在没有足够的数据时返回逻辑(TRUE
和NA
的混合)鉴于我的数据始终是正数,我将使用以下技巧使我的代码始终运行
dt4=dt3[,.(ma=rollmean(y, k = 7, fill=-1,align="right")), by = .(x)]
dt4[ma==-1,ma:=NA]
dt4
是否有适当/更好的方法?
NA_real_
而不是NA
,因为默认情况下它是NA_logical_
dt3[x == 'c', class(rollmean(y, k = 7, fill = NA, align = 'right'))]
#[1] "logical"
使用NA_real_
中的fill
,它将正常工作
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。>