Ошибка при объединении rollapply () и weighted.mean () в настройке lapply () data.table - PullRequest
0 голосов
/ 19 июня 2020

Я запустил следующий код:

id <- c(67, 39, 39, 39, 39, 39, 39, 39, 58, 58, 58, 58, 58, 58)
ratio <- c(0.5421248, 0.1558647, 0.1314578, 0.1095102, 0.1149908, 0.1645262, 0.1431160, 0.1633623,
       1.1375268, 1.3219208, 1.3830684, 1.5942101, 0.5991420, 0.6303874)
DT <- data.table(id, ratio)

DT[, 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 = 'ratio']

И он дает следующую ошибку:

Error in `[.data.table`(DT, , lapply(.SD, function(x) rollapplyr(x, width = 3,  : 
  Column 1 of result for group 2 is type 'double' but expecting type 'logical'. Column types must be consistent for each group.

Когда я исключаю первую строку следующим образом:

DT[2:14, 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 = 'ratio']

Я не получаю сообщения об ошибке. Я полагаю, это как-то связано с тем, что существует только один идентификатор = 67.

Есть ли способ избежать этой ошибки и просто получить NA для идентификатора 67?

Я действительно не понимаю почему не работает, потому что это работает:

rollapplyr(ratio, 
           width = 3,
           weighted.mean, 
           w = c(0.2, 0.3, 0.5),
           align = 'right', 
           fill = NA)

1 Ответ

3 голосов
/ 20 июня 2020

Из комментария Эндрю:

DT[, lapply(.SD, zoo::rollapplyr,
            width = 3, FUN = weighted.mean,
            w = c(0.2, 0.3, 0.5), fill = NA_real_),
   by = id, .SDcols = 'ratio']
#     id     ratio
#  1: 67        NA
#  2: 39        NA
#  3: 39        NA
#  4: 39 0.1253654
#  5: 39 0.1166400
#  6: 39 0.1386624
#  7: 39 0.1439140
#  8: 39 0.1575212
#  9: 58        NA
# 10: 58        NA
# 11: 58 1.3156158
# 12: 58 1.4764097
# 13: 58 1.0544477
# 14: 58 0.8137783

Здесь сделаны два изменения:

  1. NA на NA_real_. Многие функции требуют сохранения класса при операциях; в этом случае zoo::rollapplyr имеет входной класс numeric, но class(NA) возвращает logical. Возможно, сейчас самое время отметить, что NA на самом деле имеет как минимум семь вариантов: NA (логический), NA_integer_, NA_real_, NA_character_, c.Date(NA), c.POSIXlt(NA) и c.POSIXct(NA). . Некоторые из них задокументированы в ?NA, остальные обнаруживаются путем исследования. (Это сохранение класса также присутствует в таких функциях, как dplyr::if_else и data.table::fifelse, но, к сожалению, не в базовых ifelse.)

  2. Не ошибка, конечно, но удаление align="right", так как в этом случае оно является избыточным с использованием функции rollapplyr (завершающий r означает «справа»).

...