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

如何基于列均值与分组变量使用dplyr的mutate进行数据变换?

问题描述

我有如下示例数据,想要用mutate()创建新列,让每个dist值减去整个dist列的均值。更进一步,我希望这个均值是基于qtr分组计算的——比如qtr == 1的所有dist值,都减去qtr == 1时dist列的均值,其他季度以此类推。

示例数据生成代码:

library(tidyverse)   

set.seed(10)
rd <- rep(rep(c(1:20), each = 4))
qtr <- rep(c(1:4), times = 20)
dist <- round(rnorm(n = 80, mean = 3000, sd = 500))
df <- data.frame(rd, qtr, dist)

我目前写出的代码只能计算整体均值的差值,不知道如何纳入qtr分组逻辑:

dat %>%
  mutate(new_column = (dist - mean(dist)))
解决方案

要实现按qtr分组计算均值并生成差值列,只需在mutate()前添加group_by(qtr),这样mean(dist)会自动在每个qtr分组内计算,而非整个数据集的全局均值。

核心代码

df %>%
  group_by(qtr) %>%
  mutate(new_column = dist - mean(dist)) %>%
  ungroup()  # 可选,若后续无需保留分组状态可执行此步

代码说明

  • group_by(qtr):将数据集按qtr变量分组,后续所有计算都会在各个分组内独立进行
  • mutate(new_column = dist - mean(dist)):在每个分组内,用dist的每个值减去该分组的dist均值,生成目标新列
  • ungroup():可选操作,用于取消分组状态,防止后续数据操作受到分组的潜在影响

扩展:同时保留全局与分组差值

如果需要同时得到基于全局均值和分组均值的差值列,可以这样写:

df %>%
  mutate(global_centered = dist - mean(dist)) %>%
  group_by(qtr) %>%
  mutate(qtr_centered = dist - mean(dist)) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:52:16