我正在尝试使用
zoo::rollapply
计算 8 个观测值的移动窗口上的 z 分数。下面的示例代码是我试图实现的,但最终结果并不正确。
唯一需要注意的是我的真实数据有一些我希望忽略的 NA 值。我还希望窗口增大,直到达到 8 个观测值。
library(zoo)
df <- as.data.frame(
matrix(round(runif(n = 120, min = 1, max = 20), 0), nrow = 20)
)
z_score <- function(x){
as.numeric(round(scale(x), 2))
}
df_scaled <- df %>%
mutate_at(
vars(1:6),
~rollapply(.x, width = 8, FUN = z_score, by.column = TRUE, partial = TRUE,
align = "right"
)
)
z_score
应该返回一个标量。注意使用 last
。
library(dplyr)
library(zoo)
set.seed(123) # for reproducibility
df <- as.data.frame(
matrix(round(runif(n = 120, min = 1, max = 20), 0), nrow = 20)
)
z_score <- function(x) c(last(round(scale(x), 2)))
df %>%
mutate(across(everything(), ~ rollapplyr(.x, 8, z_score, partial = TRUE)))