具有分组data.table的rollmean返回逻辑值

问题描述 投票:1回答:1

[我试图在对数据进行分组时在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在没有足够的数据时返回逻辑(TRUENA的混合)鉴于我的数据始终是正数,我将使用以下技巧使我的代码始终运行

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

是否有适当/更好的方法?

r data.table mean
1个回答
2
投票
我们可以使用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。>
© www.soinside.com 2019 - 2024. All rights reserved.