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
相关产品推荐
相关产品推荐

