如何在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
相关产品推荐
相关产品推荐

