如何对分组数据应用统一公式计算新变量unitats_consum
分组计算unitats_consum变量的解决方案
数据集信息
数据集unitatsconsum_2021的结构如下:
structure(list(NUMERO = structure(c(21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25, 25, 25, 26, 27, 28), format.stata = "%12.0g"), unitats_consum = c(2, 2, 2, 2, 2, 2, 1.9, 1.5, 1.5, 2.5, 2.5, 2.5, 2.2, 1, 1, 2), edat = c(17, 51, 17, 14, 44, 36, 3, 67, 63, 35, 48, 17, 13, 73, 67, 73), membresllar = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 4L, 4L, 4L, 4L, 1L, 1L, 3L )), class = c("grouped_df", "tbl_df", "tbl", "data.frame" ), row.names = c(NA, -16L), groups = structure(list(NUMERO = structure(c(21, 22, 23, 24, 25, 26, 27, 28), format.stata = "%12.0g"), .rows = structure(list( 1L, 2:4, 5:7, 8:9, 10:13, 14L, 15L, 16L), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -8L), .drop = TRUE))
需求说明
需要计算新的unitats_consum变量,公式为:1 + 0.5*((edat>13的观测数)-1) + 0.3*(edat<=13的观测数)
要求同一NUMERO分组内的计算结果完全一致。
错误代码分析
你之前的代码问题在于:
- 用逐行判断的
ifelse,没有统计整组内符合条件的观测总数 - 错误引用
membresllar字段,而非实际统计的观测数量
错误代码:
Unitatsconsum_2021 <- Unitatsconsum_2021 %>% group_by(NUMERO) %>% mutate(unitats_consum = (1 + 0.5 * (ifelse(edat > 13, membresllar - 1, 0)) + 0.3 * (ifelse(edat <= 13, membresllar, 0))))
正确解决方案
在分组内用sum()统计每组中edat>13和edat<=13的观测数量,再代入公式计算,确保同一NUMERO的结果一致:
unitatsconsum_2021 <- unitatsconsum_2021 %>% group_by(NUMERO) %>% mutate( # 统计每组内edat>13的观测数 count_over13 = sum(edat > 13), # 统计每组内edat<=13的观测数 count_under13 = sum(edat <= 13), # 代入公式计算新的unitats_consum unitats_consum = 1 + 0.5 * (count_over13 - 1) + 0.3 * count_under13 ) %>% # 可选:后续不需要分组操作时取消分组 ungroup()
结果验证
以典型分组为例:
- NUMERO=22:3个观测均满足
edat>13,计算得1 + 0.5*(3-1) + 0.3*0 = 2,与预期一致 - NUMERO=23:2个
edat>13、1个edat<=13,计算得1 + 0.5*(2-1) + 0.3*1 = 1.8 - NUMERO=25:3个
edat>13、1个edat<=13,计算得1 + 0.5*(3-1) + 0.3*1 = 2.3
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

