С вашим кодом довольно много проблем.Основная проблема, которая дает вашу текущую ошибку, вызвана аргументом fill = NA
для rollapply
.По умолчанию NA
имеет тип логический, что конфликтует, когда мы пытаемся присвоить его числовому вектору, используя :=
.Поэтому вместо этого используйте fill = as.numeric(NA)
- вот так:
a[, roll_weighted_median := rollapply(
data = lag1, width = 45, FUN = weight_median_calc,
by.column = FALSE, align = 'right', fill = as.numeric(NA)),
by = .(V2, V3, V4)][]
Другая возможная проблема с вашим кодом состоит в том, что weight_median_calc
выдаст ошибку, если ему будут переданы только NA
значения.Мы можем переписать это так, чтобы избежать этих ошибок
weight_median_calc <- function(u){
if (!all(is.na(u)))
weighted.median(x = u, w = w[1:length(u)])
else as.numeric(NA)
}
Третья проблема, которую нужно исправить, - это использование lag
.lag
не имеет аргумента n=
.В data.table вы, вероятно, должны использовать shift
вместо
a[, lag1 := shift(V1, 1), by = .(V2)]
Последнее, что вам следует знать, это то, что в data.table
нельзя использовать назначение <-
в сочетании с :=
назначение.:=
уже сделал назначение на месте, поэтому нет необходимости копировать результаты снова, используя <-
.Другими словами, не делайте a <- a[, foo := bar]
.Просто сделай a[, foo := bar]