R语言:按NUMERO分组,基于多列条件生成共享变量的问题
问题描述
给定数据集Unitatsconsum_2021,结构如下:
structure(list(NUMERO = structure(c(15, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21), format.stata = "%12.0g"), edat = c(41, 84, 53, 66, 65, 73, 72, 62, 60, 34, 54, 52, 24, 48, 12, 17), membres = c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L)), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, -16L), groups = structure(list( NUMERO = structure(c(15, 16, 17, 18, 19, 20, 21), format.stata = "%12.0g"), .rows = structure(list(1L, 2:3, 4:5, 6:7, 8:10, 11:13, 14:16), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -7L), .drop = TRUE))
需要创建新变量unitats_consum,计算公式为:
1 + 0.5*((年龄>13的家庭成员数)-1) + 0.3*(年龄<=13的家庭成员数)
要求同一NUMERO(家庭编号)对应的unitats_consum值完全一致。
尝试的代码存在条件运算符使用错误,且分组计算逻辑不准确:
Despesa_unitatsconsum_2021 <- Despesa_membres_llar_2021 %>% group_by(NUMERO) %>% mutate(unitats_consum = (1 + 0.5*((membres if edat > 13)-1) + 0.3*((membres if edat <= 13))))
解决方案
核心思路
- 按
NUMERO分组,确保每个家庭的计算结果统一 - 分组后统计每个家庭中年龄>13的成员数和年龄<=13的成员数
- 代入公式计算
unitats_consum,并将结果广播到该组的所有行
正确代码
# 先解除原有分组(避免层级冲突) Unitatsconsum_2021 <- Unitatsconsum_2021 %>% ungroup() # 分组计算并生成目标变量 Despesa_unitatsconsum_2021 <- Unitatsconsum_2021 %>% group_by(NUMERO) %>% mutate( # 统计家庭内年龄>13的成员数量 adults = sum(edat > 13), # 统计家庭内年龄<=13的成员数量 kids = sum(edat <= 13), # 代入公式计算消费单位 unitats_consum = 1 + 0.5*(adults - 1) + 0.3*kids ) %>% # 可选:移除中间统计变量 select(-adults, -kids)
代码说明
sum(edat > 13):在分组内将布尔值(TRUE/FALSE)转换为数值(1/0)求和,得到对应年龄区间的成员数mutate会将分组计算的结果自动应用到该组所有行,确保同一NUMERO的unitats_consum值完全一致- 若原数据集已分组,先执行
ungroup()可避免分组层级冲突
结果验证
以NUMERO=21为例,该家庭有3个成员:年龄48(>13)、12(<=13)、17(>13),计算得:adults=2,kids=1unitats_consum=1 + 0.5*(2-1) + 0.3*1 = 1.8
该家庭的3行数据都会得到1.8的结果,符合要求
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

