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 在没有足够数据时是合乎逻辑的(TRUE
和 NA
的混合)
鉴于我的数据总是积极的,我使用以下技巧使我的代码 运行 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
我在分组数据时尝试在 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 在没有足够数据时是合乎逻辑的(TRUE
和 NA
的混合)
鉴于我的数据总是积极的,我使用以下技巧使我的代码 运行 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