簡體   English   中英

data.table (r) 中的加權滾動中位數

[英]weighted rolling median in data.table (r)

我知道大量函數計算滾動中位數,但我找不到任何計算加權滾動中位數的函數(我找到了 ema,但這是平均值)。 這是我嘗試過的

*** 於 2019 年 1 月 31 日編輯:當我僅按 V2 分組時,我發現代碼工作正常。 只有當我按 V2:V4 分組時才會發生錯誤

library(spatstat)
library(data.table)
library(zoo)


a <- data.table(V1 = c(rep(NA, 10), runif(90)), 
                V2 = c(rep('good', 50), rep('bad', 50)),
                V3 = c(rep('monday', 70), rep('friday', 30)),
                V4 = c(rep('male', 90), rep('female', 10)))
a <- a[,'lag1':=lag(V1, n = 1), by = .(V2)]
set.seed(55)
rn <- runif(45)
w <- sort(rn/sum(rn), decreasing = T)

weight_median_calc <- function(u){
  weighted.median(x = u,
                w = w)
}

a <- a[,'roll_weighted_median':= 1][,roll_weighted_median:=rollapply(data = lag1,
                                                                   width = 45,
                                                                   FUN = weight_median_calc,
                                                                   by.column = FALSE,
                                                                   align = 'right',
                                                                   fill = NA
),
by = .(V2, V3, V4)][]

[.data.table (a[, := ("roll_weighted_median", 1)], , := (roll_weighted_median, : Type of RHS ('logical') must match LHS ('double') 中的錯誤。檢查和強制對於最快的情況會影響性能太多。要么更改目標列的類型,要么強制 := 自己的 RHS(例如,使用 1L 而不是 1)

你的代碼有很多問題。 導致您當前錯誤的主要問題是由rollapplyfill = 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)][]

您的代碼的另一個可能問題是,如果僅傳遞NA值,則weight_median_calc將引發錯誤。 我們可以這樣重寫以避免這些錯誤

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]

暫無
暫無

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

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