R语言实现自定义窗口的条件求和功能咨询
R 自定义窗口求和功能实现
完整实现代码
sum_window_by_ones <- function(df, ones_col = "Ones", thats_col = "Thats", gap = 1) { # 定位所有Ones列为1的行号 n_pos <- which(df[[ones_col]] == 1) # 遍历每个匹配行计算求和结果 res <- lapply(n_pos, function(n) { # 计算窗口边界,自动钳位避免超出数据范围 win_start <- max(1, n - gap) win_end <- min(nrow(df), n + gap) # 求和自动忽略NA值 sum_val <- sum(df[win_start:win_end, thats_col], na.rm = TRUE) # 返回结构化结果 data.frame( 匹配行号 = n, 窗口范围 = paste0(win_start, "-", win_end), 求和结果 = sum_val ) }) # 合并结果为数据框返回 do.call(rbind, res) }
功能说明
- 自动识别输入数据框中指定列取值为1的所有行号,支持多匹配场景
- 窗口边界通过
max/min函数钳位,若1位于数据集首尾,自动截断窗口到合法行号范围 - 求和时默认开启
na.rm = TRUE,自动忽略窗口内的NA值,仅对有效数据求和 - 支持自定义gap参数,gap为N时窗口覆盖
n-N到n+N共2N+1行(边界场景自动调整)
测试示例
使用你提供的测试数据运行:
# 测试数据 dat<- data.frame ( 'Ones'=c(0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0), 'Thats'=c(0,5,3,6,8,4,5,6,8,3,1,3,4,5,6,7,4,3,4,5) ) # gap=1测试 sum_window_by_ones(dat, gap = 1) # gap=2测试 sum_window_by_ones(dat, gap = 2)
输出结果
gap=1时输出:
| 匹配行号 | 窗口范围 | 求和结果 |
|---|---|---|
| 6 | 5-7 | 17 |
| 11 | 10-12 | 7 |
gap=2时输出:
| 匹配行号 | 窗口范围 | 求和结果 |
|---|---|---|
| 6 | 4-8 | 29 |
| 11 | 9-13 | 19 |
内容的提问来源于stack exchange,提问作者piravi
相关产品推荐
相关产品推荐

