r语言 - 在 lapply() data.table 设置中组合 rollapply() 和 weighted.mean(



我运行了以下代码:

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']

我没有收到错误。我想这与只有一个id = 67有关。

有没有办法避免此错误并只获取 id 67 的 NA?

我真的不明白为什么它不起作用,因为这有效:

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

来自安德鲁的评论:

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. NANA_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_elsedata.table::fifelse等函数中,但遗憾的是,基的ifelse中没有。

  2. 当然,这不是错误,而是删除align="right",因为在这种情况下,使用rollapplyr函数是多余的(尾随r表示"正确"(。

最新更新