R语言时间序列数据框按组匹配列值生成虚拟变量与累计胎次
R实现女性生育史面板变量计算方案
核心思路
之前用ifelse仅判断年份是否存在,没有统计年份在子女出生列中的出现次数,所以无法识别多孩场景。直接逐行统计当前date_year在nchild1~nchild10列中的匹配次数,再基于次数赋值,累计孩次通过分组按年累加即可实现,不需要复杂嵌套判断。
可直接运行的代码
library(dplyr) df <- df %>% # 按女性唯一标识分组 group_by(id_mdob) %>% # 逐行计算当年生育子女数 rowwise() %>% mutate( # 统计当前date_year在10个子女出生年份列中的匹配次数,自动忽略空值 annual_birth_num = sum(c_across(nchild1:nchild10) == date_year, na.rm = TRUE), # 按规则赋值birth_in_year birth_in_year = case_when( annual_birth_num == 1 ~ 1, annual_birth_num >= 2 ~ 2, TRUE ~ 0 ) ) %>% ungroup() %>% # 回到分组维度,按年份升序计算累计生育孩次 group_by(id_mdob) %>% arrange(date_year, .by_group = TRUE) %>% mutate( prev_parity = cumsum(annual_birth_num) ) %>% ungroup()
逻辑验证
- 针对示例样本:
id_mdob为113230821119852011的记录,nchild1、nchild2均为2001,1995年有1个子女出生- 1995年行
annual_birth_num=1,birth_in_year=1,累计后prev_parity=1 - 2001年行
annual_birth_num=2,birth_in_year=2,累计后prev_parity=1+2=3 - 2001年之后所有无生育的年份
annual_birth_num=0,birth_in_year=0,prev_parity保持3不变
- 1995年行
- 自动兼容子女数不足10个时
nchild列的NA值,不需要提前做缺失值填充处理 - 如果存在同一年生育3孩及以上的极端情况,代码也会正确给
birth_in_year赋值为2,累计孩次同步累加对应数量
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

