You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含缺失值的多列数据如何计算3天窗口滚动相关系数

多字段3天滚动两两相关系数实现方案

完整可运行代码

# 加载依赖包
library(zoo)

# 构造示例数据
set.seed(42) 
n <- 10
dat <- data.frame(id=1:n, 
                  date=seq.Date(as.Date("2020-12-22"), as.Date("2020-12-31"), "day"),
                  x=rnorm(n),
                  y=rnorm(n),
                  z=rnorm(n),
                  a=rnorm(n))
dat$y[1:2] <- NA
dat$a[1:3] <- NA

# 提取需要计算相关的数值字段
num_cols <- dat[, c("x", "y", "z", "a")]
# 生成所有两两变量组合(如需xy和yx分开计算,可替换为expand.grid(colnames(num_cols), colnames(num_cols))再过滤变量名相同的行)
var_pairs <- combn(colnames(num_cols), 2, simplify = FALSE)

# 遍历所有配对计算3天右对齐滚动相关
roll_cor_res <- lapply(var_pairs, function(p) {
  roll_cols <- num_cols[, p]
  # 滚动计算逻辑:窗口内有效配对数≥3时返回相关系数,否则返回NA
  cor_vals <- rollapplyr(roll_cols, width = 3, function(w) {
    complete_cnt <- sum(complete.cases(w))
    if (complete_cnt < 3) return(NA_real_)
    cor(w[,1], w[,2], use = "pairwise.complete.obs")
  }, by.column = FALSE)
  # 按规则命名结果列
  setNames(data.frame(cor_vals), paste0("cor_", p[1], "_", p[2]))
})

# 合并相关系数结果与原始数据
final_res <- cbind(dat, do.call(cbind, roll_cor_res))

逻辑说明

  • 配对覆盖:默认生成无重复的两两组合,若需要保留xy、yx这类对称结果,替换combn生成配对的代码即可
  • 缺失值适配:通过complete.cases判断窗口内两个字段的共同有效样本数,不足3个时返回NA,自动实现从两个字段都有足够有效值的节点开始计算的需求
  • 窗口规则:rollapplyr默认右对齐,符合滚动窗口统计的通用习惯

内容的提问来源于stack exchange,提问作者Westwinter1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:45:01