簡體   English   中英

在 lapply() data.table 設置中組合 rollapply() 和 weighted.mean() 時出錯

[英]Error when combining rollapply() and weighted.mean() in an lapply() data.table setting

我運行了以下代碼:

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_ 許多函數強制在操作中保留 class; 在這種情況下, zoo::rollapplyr的輸入 class 為numeric ,但class(NA)返回logical 現在可能是時候注意到NA實際上至少有七個變體: NA (邏輯)、 NA_integer_NA_real_NA_character_c.Date(NA)c.POSIXlt(NA)c.POSIXct(NA) 其中一些記錄在?NA中,其他的是通過探索發現的。 (class 的保留也存在於dplyr::if_elsedata.table::fifelse等函數中,但遺憾的是不存在於 base 的ifelse中。)

  2. 當然,這不是錯誤,而是刪除align="right" ,因為在這種情況下,使用rollapplyr function 是多余的(尾隨的r表示“正確”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM