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

