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

如何在R中实现固定区间滚动均值(Rolling mean)计算

R实现固定区间加权平均值计算

依赖准备

使用tidyverse套件实现数据处理,未安装的可先执行:

install.packages("tidyverse")

完整实现代码

library(tidyverse)

# 1. 构造原始数据集
raw_data <- tibble(
  start = c(4, 21, 34, 46),
  end = c(20, 33, 45, 60),
  value = c(20, 40, 30, 10),
  value_per_unit = c(1.25, 3.33, 2.73, 0.71)
)

# 2. 定义参数生成固定区间
window_length <- 10
min_start <- min(raw_data$start)
max_end <- max(raw_data$end)
# 生成所有窗口的起止值,此处按离散闭区间计算(如4-13共10个单位)
window_df <- tibble(
  start = seq(min_start, max_end, by = window_length),
  end = start + window_length - 1
)

# 3. 计算每个窗口的加权value_per_unit
result <- window_df %>%
  # 每个窗口匹配所有原始记录,dplyr版本低于1.1.0的可替换为full_join(raw_data, by = character(), suffix = c("_w", "_raw"))
  cross_join(raw_data, suffix = c("_w", "_raw")) %>%
  # 计算重叠区间的起止
  mutate(
    overlap_start = pmax(start_w, start_raw),
    overlap_end = pmin(end_w, end_raw)
  ) %>%
  # 过滤无重叠的匹配项
  filter(overlap_start <= overlap_end) %>%
  # 计算重叠长度
  mutate(overlap_len = overlap_end - overlap_start + 1) %>%
  # 按窗口分组计算加权平均值
  group_by(start_w, end_w) %>%
  summarise(
    value_per_unit = sum(overlap_len * value_per_unit) / window_length,
    .groups = "drop"
  ) %>%
  # 重命名列匹配输出要求
  rename(start = start_w, end = end_w)

# 查看结果
print(result, digits = 4)

输出结果示例

运行上述代码后输出如下:

# A tibble: 6 × 3
  start   end value_per_unit
  <dbl> <dbl>          <dbl>
1     4    13          1.25 
2    14    23          1.874
3    24    33          3.33 
4    34    43          2.73 
5    44    53          1.114
6    54    63          0.497

适配说明

如果你的区间是连续型数值(比如时间、距离等连续单位,不是离散计数单位),只需调整两处计算逻辑:

  • 窗口结束值改为end = start + window_length
  • 重叠长度计算改为overlap_len = overlap_end - overlap_start

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:45:04