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

R语言dplyr group_by分组后如何计算去重唯一值的权重均值

dplyr分组计算去重个体权重均值实现方案

需求说明

按country、state、date三个字段对数据框分组,需计算3项汇总指标:

  • 唯一household_id与individual_id组合的计数
  • 去重后唯一个体的weights平均值:每个唯一household_id + individual_id组合仅取1次权重值参与计算,剔除同一主体的重复记录
  • duration字段的全量记录总和

现有代码已实现唯一个体计数、总时长统计,但权重均值计算未做去重处理,结果存在偏差:

data %>% group_by(country,state,date) %>% 
 summarise(Total_unique = n_distinct(household_id,individual_id),
        Tot_Duration = sum(duration))

示例数据构造代码:

library(dplyr)
data <- data.frame(country = c("US","US","US","US","US","US","IND","IND"),
              state = c("TX","TX","TX","TX","TX","TX","AP","AP"),
              date = c(20220601,20220601,20220601,20220601,20220601,20220601,20220601,20220601),
              household_id = c(100,100,100,101,101,101,102,102),
              individual_id=c(1,2,1,1,2,3,1,1),
              weights = c(100,50,100,200,200,200,100,100),
              duration = c(10,20,30,40,50,60,70,80))

实现代码

核心逻辑:计算权重均值时,仅对当前分组下的唯一个体及对应权重去重后求均值,禁止提前对全表去重,避免丢失重复记录对应的duration值导致总时长统计错误。

result <- data %>% 
  group_by(country, state, date) %>% 
  summarise(
    Total_unique = n_distinct(household_id, individual_id),
    Average_weights = {
      # 提取当前分组下唯一个体对应的权重,每个个体仅保留1条记录
      unique_ind_df <- distinct(cur_data(), household_id, individual_id, weights)
      mean(unique_ind_df$weights)
    },
    Tot_Duration = sum(duration),
    .groups = "drop"
  )

结果校验

运行代码后输出结果完全符合预期:

  • US、TX、20220601分组:共5个唯一个体,权重均值为(100 + 50 + 200 + 200 + 200)/5 = 150,总时长为210
  • IND、AP、20220601分组:共1个唯一个体,权重均值为100,总时长为150

常见误区:直接使用mean(weights)计算均值会将同一个体的重复记录权重重复计入,例如示例中100户1号个体出现2次,权重100会被计算2次,导致结果偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:45:39