如何按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
原有代码问题分析
- 第一段代码用
summarize(total_count=n()),统计的是每组的总人数,不是emp=1的就业人数,并且summarize会将每组压缩为一行,无法直接关联到原数据的每一行。 - 第二段代码
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
相关产品推荐
相关产品推荐

