我知道很多函数可以计算滚动中位数,但是找不到任何可以计算加权滚动中位数的东西(我找到了ema,但这只是平均值)。这是我尝试过的
***于2019年1月31日编辑: 我发现仅按V2分组时,代码可以正常工作。仅当我按V2:V4分组时才会发生该错误
&Age
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)][]
(a [,[.data.table
(“ roll_weighted_median”,1)],,:=
(roll_weighted_median,:中的错误: RHS的类型(“逻辑”)必须与LHS(“双精度”)匹配。在最快的情况下,检查和强制执行会严重影响性能。更改目标列的类型,或强制:=您自己的RHS(例如,使用1L代替1)
答案 0 :(得分:1)
您的代码有很多问题。给您当前错误的主要问题是由fill = NA
的{{1}}参数引起的。默认情况下,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)][]
如果仅传递weight_median_calc
值,则会引发错误。我们可以把它改写这样的,以避免这些错误
NA
要解决的第三个问题是您使用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
参数。在data.table中,您可能应该改用n=
shift
应注意的最后一点是,在a[, lag1 := shift(V1, 1), by = .(V2)]
,一个人不能使用data.table
分配与<-
分配相结合。 :=
已经完成分配,因此无需使用:=
重新复制结果。换句话说,不要执行<-
。只需a <- a[, foo := bar]