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

R中如何按组计算变量均值并生成可用于回归的新变量

R中按分组生成分组均值列的可行方案

你现有代码中最后调用的summarise()会将每个分组的结果聚合为1行,无法保留原始数据的所有行。如果要给每一行赋值对应分组的统计均值,可参考以下几种常用方案,生成的结果可直接用于后续回归、分类分析:

方案1:dplyr原生方案(最符合你现有代码逻辑)

在group_by()之后使用mutate()生成新列,分组统计的均值会自动匹配到同组的每一行:

library(dplyr)
DF <- data.frame(Height = rnorm(100, 170, 5),
                 Weight = rnorm(100, 55, 5),
                 Gender = c(rep("male", 50), rep("female", 50)))

BMI <-  function(height,weight){(weight/(height)^2*10000)}

# 输出保留所有原始行、新增分组统计列的数据集
DF_processed <- DF %>% 
  group_by(Gender) %>% 
  mutate(
    bmi = BMI(Height, Weight),
    # 同性别所有行的该列值均为当前性别身高均值
    gender_mean_height = mean(Height, na.rm = TRUE),
    # 同性别所有行的该列值均为当前性别BMI均值
    gender_mean_bmi = mean(bmi, na.rm = TRUE)
  ) %>% 
  ungroup() # 处理完成后取消分组,避免后续操作误触发分组逻辑

后续做回归直接调用该数据集即可,示例:

# 例如用分组身高均值、个人BMI预测体重
fit <- lm(Weight ~ gender_mean_height + bmi, data = DF_processed)
summary(fit)

方案2:Base R 方案(无需加载第三方包)

使用内置的ave()函数直接生成分组均值列:

# 生成分组身高均值
DF$gender_mean_height <- ave(DF$Height, DF$Gender, FUN = \(x) mean(x, na.rm = TRUE))
# 生成BMI
DF$bmi <- BMI(DF$Height, DF$Weight)
# 生成分组BMI均值
DF$gender_mean_bmi <- ave(DF$bmi, DF$Gender, FUN = \(x) mean(x, na.rm = TRUE))

方案3:data.table 方案(适合大数据量场景,运行效率更高)

library(data.table)
# 转换为data.table格式
setDT(DF)
# 按性别分组新增列
DF[, `:=`(
  bmi = BMI(Height, Weight),
  gender_mean_height = mean(Height, na.rm = TRUE),
  gender_mean_bmi = mean(BMI(Height, Weight), na.rm = TRUE)
), by = Gender]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:00