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

如何编写R循环函数实现数据框内指标计算与符号验证?

R滑动窗口指标计算函数实现

示例数据框

df <- structure(list(Delt.1.arithmetic = c(0.002519607, 0.03247049, 
0.01268653, 0.01105899, -0.003642582, -0.02468412, -0.04560344, 
0.0501897, -0.01963724, -0.01068217, -0.1203641, 0.1604419, 0.001868874, 
0.04664339, 0.01482009, 0.05694765, 0.2006065, 0.0187676, 0.02741049, 
0.0339604)), class = "data.frame", row.names = c(NA, -20L))

需求说明

  1. 以滑动窗口方式取连续5个值,如df[1:5,];
  2. 计算窗口内每个值的符号,如sign(df[1:5,]),输出示例为[1] 1 1 1 1 -1,其中1代表正,-1代表负;
  3. 计算窗口内正负值的出现概率,忽略sign函数返回的0值;
  4. 计算出现概率最高的符号对应数值的平均值;
  5. 将该平均值的符号与窗口下一个值(如窗口df[1:5,]对应第6个值)的符号比较,符号相同返回TRUE,否则返回FALSE;
  6. 对整个数据集重复上述流程,窗口每次滑动1位,最终将所有布尔结果存入变量;
  7. 下一个待比较值会纳入下一次循环的窗口中,如第二次循环处理df[2:6,]并验证第7个值。

初始尝试代码

predictor <- function() { 
  x <- 1
  y <- 5
  w <- x + 1
  z <- y + 1
  P1 <- rv_returns[x:y,]
  P2 <- rv_returns[w:z,]
  
  repeat {
    w <- w + 1
    z <- z + 1
    sign(rv_returns[w:z,])

}
}
predictor()

解决方案

完整函数实现

predictor <- function(df, window_size = 5) {
  # 提取数据列(假设仅处理第一列)
  values <- df[[1]]
  total_rows <- length(values)
  # 初始化结果向量,长度为总数据量减窗口大小
  results <- logical(total_rows - window_size)
  
  for(i in 1:(total_rows - window_size)) {
    # 获取当前窗口的数值
    window_vals <- values[i:(i + window_size - 1)]
    # 计算符号并过滤0值
    window_signs <- sign(window_vals)
    window_signs <- window_signs[window_signs != 0]
    
    # 处理窗口全为0的边界情况
    if(length(window_signs) == 0) {
      results[i] <- FALSE
      next
    }
    
    # 计算正负符号的出现概率
    pos_count <- sum(window_signs == 1)
    neg_count <- sum(window_signs == -1)
    pos_prob <- pos_count / length(window_signs)
    neg_prob <- neg_count / length(window_signs)
    
    # 确定概率最高的主导符号
    if(pos_prob > neg_prob) {
      dominant_sign <- 1
    } else if(neg_prob > pos_prob) {
      dominant_sign <- -1
    } else {
      # 概率相等时默认取正,可按需调整
      dominant_sign <- 1
    }
    
    # 计算主导符号对应数值的平均值及其符号
    avg_val <- mean(window_vals[sign(window_vals) == dominant_sign])
    avg_sign <- sign(avg_val)
    
    # 获取下一个值的符号并比较
    next_val_sign <- sign(values[i + window_size])
    results[i] <- (avg_sign == next_val_sign)
  }
  
  return(results)
}

函数说明

  • 支持自定义窗口大小(默认5),适配不同需求
  • 处理窗口全为0的边界场景,默认返回FALSE,可根据业务逻辑调整
  • 正负概率相等时默认选择正符号作为主导,可按需修改规则
  • 返回值为布尔向量,长度等于数据总行数减去窗口大小

测试示例

# 调用函数计算结果
result <- predictor(df)
# 查看最终布尔结果
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:15:42