如何在R中用aggregate()按团队和日期范围计算条件均值并添加至数据集?
用aggregate()实现按Team和滚动时间窗口计算均值
首先构造示例数据集:
df <- data.frame( day = c(1,1,1,2,2,2,3,3,3), team = c("A","B","C","A","B","C","A","B","C"), data = c(5,2,1,2,3,1,0,2,1) ) range <- 2 # 定义时间窗口范围
实现步骤
- 为每行生成唯一窗口标识:结合
team、窗口起始日(max(1, day - range + 1))和当前day,生成window_key,确保同一窗口内的行拥有相同标识。 - 用
aggregate()按window_key分组计算data的均值。 - 将计算得到的均值合并回原数据集,整理列顺序和名称。
完整代码
# 生成窗口标识 df$window_key <- with(df, paste0(team, "_", pmax(1, day - range + 1), "_", day)) # 用aggregate计算每个窗口的均值 mean_df <- aggregate(data ~ window_key, data = df, FUN = mean) # 合并均值到原数据集 df <- merge(df, mean_df, by = "window_key", suffixes = c("", "_mean")) # 整理列顺序和名称,恢复原数据排序 df <- df[, c("day", "team", "data", "data_mean")] colnames(df)[4] <- "mean" df <- df[order(df$day, df$team), ] rownames(df) <- NULL
结果验证
运行后得到的数据集与示例要求一致:
day team data mean 1 1 A 5 5.0 2 1 B 2 2.0 3 1 C 1 1.0 4 2 A 2 3.5 5 2 B 3 2.5 6 2 C 1 1.0 7 3 A 0 1.0 8 3 B 2 2.5 9 3 C 1 1.0
内容的提问来源于stack exchange,提问作者MelBourbon
相关产品推荐
相关产品推荐

