rollmean с сгруппированным data.table возвращает логический - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь использовать 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

Есть ли правильный / лучший способ сделать это?

1 Ответ

2 голосов
/ 20 марта 2020

Мы можем использовать 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, но отличие состоит в том, что он приводится к цифре c NA, когда есть элементы не-NA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...