Я пытаюсь использовать rollmean из пакета zoo в data.table при группировке данных.
Работает нормально, когда во всех группах достаточно данных:
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)]
Вот сообщение об ошибке:
Столбец 1 результата для группы 3 имеет тип «логический», но ожидаемый тип «двойной». Типы столбцов должны быть согласованы для каждой группы.
Кажется, это происходит потому, что rollmean возвращает логическое (сочетание TRUE
и NA
), когда у него недостаточно данных, учитывая, что мой данные всегда положительны. Я все равно использую следующий трюк, чтобы мой код выполнялся
dt4=dt3[,.(ma=rollmean(y, k = 7, fill=-1,align="right")), by = .(x)]
dt4[ma==-1,ma:=NA]
dt4
Есть ли правильный / лучший способ сделать это?