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

如何在R语言中实现分组平衡均值计算?

在R中计算分组平衡均值的解决方案

当然能实现啦!这种先按姓名聚合再按地点计算平衡均值的需求,在R里有好几种简洁的实现方式,我给你演示两种最常用的方法,都能完美解决你的问题。

方法一:使用dplyr包(推荐,代码更直观)

dplyr的管道语法能让你清晰地分步完成计算,先构造和你示例匹配的测试数据:

library(dplyr)

# 构造示例数据,和你描述的IL、Jeff的情况一致
df <- tibble(
  Location = c("IL", "IL", "IL", "NY", "NY"),
  Name = c("Jeff", "Jeff", "Alice", "Bob", "Bob"),
  Value = c(12, 13, 45, 20, 30)
)

接下来分两步计算:

  1. 先按姓名+地点分组,计算每个姓名在对应地点的均值(确保同一个姓名在不同地点的记录不会混淆)
  2. 再按地点分组,计算这些姓名均值的平均值,也就是你要的平衡均值
# 第一步:计算每个姓名的均值
name_level_means <- df %>%
  group_by(Name, Location) %>%
  summarize(Name_Mean = mean(Value), .groups = "drop")

# 第二步:计算地点的平衡均值
location_balanced_means <- name_level_means %>%
  group_by(Location) %>%
  summarize(Balanced_Mean = mean(Name_Mean))

# 查看结果
location_balanced_means

运行后你会得到:

# A tibble: 2 × 2
  Location Balanced_Mean
  <chr>            <dbl>
1 IL                28.8
2 NY                25  

完全符合你示例中IL地区28.75的计算结果。

方法二:使用基础R原生函数

如果你不想加载额外的包,用base R的aggregate()函数也能完成同样的操作:

# 构造同样的示例数据
df <- data.frame(
  Location = c("IL", "IL", "IL", "NY", "NY"),
  Name = c("Jeff", "Jeff", "Alice", "Bob", "Bob"),
  Value = c(12, 13, 45, 20, 30)
)

# 第一步:按姓名+地点聚合求均值
name_level_means_base <- aggregate(Value ~ Name + Location, data = df, FUN = mean)
# 重命名列名方便后续操作
colnames(name_level_means_base)[3] <- "Name_Mean"

# 第二步:按地点聚合求平衡均值
location_balanced_means_base <- aggregate(Name_Mean ~ Location, data = name_level_means_base, FUN = mean)

# 查看结果
location_balanced_means_base

运行后得到的结果和dplyr方法完全一致:

Location Name_Mean
1       IL      28.75
2       NY      25.00

关键逻辑说明

之所以要分两步计算,核心是为了避免同一个姓名的多条记录过度影响地点均值。比如你例子里的Jeff有两个值,如果直接按地点求均值会得到(12+13+45)/3≈23.33,这显然不是你想要的。先把同一个人的值合并成一个均值,再对地点内的个人均值求平均,就能得到真正的“平衡”均值啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:52:58