Объединение rollapply () и weighted.mean () в data.table apply () для нескольких столбцов - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь вычислить средневзвешенные значения для различных столбцов в data.table с rollapply() и weighted.mean() следующим образом:

DT <- data.table(id = rep(c(1,2), each = 5),
                 var1 = 1:10,
                 var2 = 11:20)
col_names <- c('var1', 'var2')
DT[, (col_names) := lapply(.SD, 
                           function(x) rollapplyr(x, 
                                                  width = 3,
                                                  weighted.mean, 
                                                  w = c(0.2, 0.3, 0.5),
                                                  align = 'right', 
                                                  partial = TRUE, 
                                                  na.rm = TRUE)),
   by = id,
   .SDcols = col_names]

Однако я получаю сообщение об ошибке:

Error in weighted.mean.default(data[replace(posns, !ix, 0)], ...) : 
  'x' and 'w' must have the same length 

Это потому, что .SD - это таблица данных, а weighted.mean() не работает с таблицами данных?

Есть ли способ заставить его работать?

1 Ответ

2 голосов
/ 18 июня 2020

Если мы удалим partial = TRUE, он должен работать вместе с добавлением fill = NA

library(data.table)
DT[, (col_names) := lapply(.SD, 
                           function(x) rollapplyr(x, 
                                                  width = 3,
                                                  weighted.mean, 
                                                  w = c(0.2, 0.3, 0.5),
                                                  align = 'right', 
                                                  fill = NA
                                                  )),
   by = id,
   .SDcols = col_names]

С partial = TRUE длина 'w' такая же, как 3, и нет подмножества, которое создает ошибка разницы в длине между 'x' и 'w'

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