如何基于列均值与分组变量使用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
相关产品推荐
相关产品推荐

