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

如何按fam_id分组统计emp总数并匹配至每行(R语言dplyr)

问题:按家庭统计就业人数并添加至原数据每行

需要对数据集acs_5years按fam_id分组,统计每个家庭中emp列值为1的人数(即就业人数),并将该统计结果作为total_employed列添加到原数据的每一行,同一家族的所有行对应相同的就业总数。

原始数据

fam_id  emp  ins  age
33      1    1    45
33      0    1    23
44      1    1    19
44      1    0    26
44      1    0    54
44      1    0    50
77      1    1    33
77      1    1    38
77      1    1    44
88      1    0    65
88      0    0    90

期望输出

fam_id  emp  ins  age  total_employed
33      1    1    45     1
33      0    1    23     1
44      1    1    19     4
44      1    0    26     4
44      1    0    54     4
44      1    0    50     4
77      1    1    33     3
77      1    1    38     3
77      1    1    44     3
88      1    0    65     1
88      0    0    90     1

原有代码问题分析

  1. 第一段代码用summarize(total_count=n()),统计的是每组的总人数,不是emp=1的就业人数,并且summarize会将每组压缩为一行,无法直接关联到原数据的每一行。
  2. 第二段代码summarize(total_count=(emp))逻辑错误,summarize要求每组返回单个值,直接传入emp会导致仅返回该组的第一个emp值(或报错),没有实现求和统计。

解决方案

方法1:使用mutate直接添加统计列(推荐)

mutate会保留原数据的所有行,对每组计算就业人数并填充到每行的新列中:

library(dplyr)

acs_5years <- acs_5years %>%
  group_by(fam_id) %>%
  mutate(total_employed = sum(emp)) %>%
  ungroup() # 可选:取消分组,避免后续操作受分组影响

方法2:先统计再关联原数据

先分组统计每个家庭的就业人数,再通过left_join将统计结果合并到原数据:

library(dplyr)

# 第一步:分组统计就业人数
emp_summary <- acs_5years %>%
  group_by(fam_id) %>%
  summarize(total_employed = sum(emp), .groups = 'drop')

# 第二步:合并到原数据
acs_5years <- acs_5years %>%
  left_join(emp_summary, by = "fam_id")

验证结果

运行上述任意一种方法后,acs_5years数据框将包含期望的total_employed列,同一家族的所有行对应相同的就业总数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:05:37