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

R语言分组计算指定day范围内value均值的高效实现问题

高效计算分组内邻近day的value均值

要实现按group分组,为每行生成output列(值为同组内day与当前行day差值绝对值≤1的所有value的均值),针对大数据集,推荐使用data.table的非等值自连接方案,效率远高于逐行循环或简单分组计算。

示例输入数据

df <- read.table(text = "
index    group  day     value
1        A      1       10
2        A      2       20
3        A      3       30
4        B      2       20
5        B      3       30
6        B      5       50", header = TRUE)

高效解决方案(data.table)

data.table的非等值连接经过底层优化,能大幅降低大数据集的计算开销:

library(data.table)

# 转换为data.table格式
setDT(df)

# 非等值自连接计算均值
df[, output := df[.SD, on = .(group = group, day >= day - 1, day <= day + 1), 
                  mean(value), by = .EACHI]$V1]

运行后得到的结果与期望一致:

index group day value output
1:     1     A   1    10     15
2:     2     A   2    20     20
3:     3     A   3    30     25
4:     4     B   2    20     25
5:     5     B   3    30     25
6:     6     B   5    50     50

代码解释

  • on = .(group = group, day >= day - 1, day <= day + 1):指定连接条件,匹配同group且day在当前行day±1范围内的行
  • by = .EACHI:对左表的每一行(即原数据的每一行)单独计算连接结果的均值
  • 这种方式避免了O(n²)的笛卡尔积计算,利用data.table的高效索引和连接引擎,处理百万级数据也能保持较快速度

备选方案(dplyr + purrr)

如果习惯tidyverse语法,可使用以下方案,但大数据集下效率略低于data.table:

library(dplyr)
library(purrr)

df %>%
  group_by(group) %>%
  mutate(output = map_dbl(day, ~ mean(value[between(day, .x - 1, .x + 1)]))) %>%
  ungroup()

代码解释

  • 按group分组后,用map_dbl遍历每个day,筛选同组内day在目标范围内的value并计算均值
  • 本质是逐行处理,数据量较大时性能不如data.table的非等值连接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:28:27