如何在R中实现Stata识别多户主、无户主家庭的代码功能
R实现多户主/无户主家庭识别
你可以通过分组统计实现该需求,无需专门的第三方命令,常用实现方式有dplyr包和基础R两种,和你给出的Stata逻辑完全对应:
方法1:dplyr包实现(语法和Stata逻辑更接近)
步骤1:加载依赖包、导入数据
# 加载dplyr包,未安装可先运行 install.packages("dplyr") library(dplyr) # 导入你提供的示例数据 df <- structure(list(ID = c("SS/CR/BIA/ABEYOONG/1/0001/05", "SS/CR/BIA/ABEYOONG/1/0001/03", "SS/CR/BIA/ABEYOONG/1/0001/04", "SS/CR/BIA/ABEYOONG/1/0001/02", "SS/CR/BIA/ABEYOONG/1/0001/01", "SS/CR/BIA/ABEYOONG/1/0002/01", "SS/CR/BIA/ABEYOONG/1/0002/04", "SS/CR/BIA/ABEYOONG/1/0002/03", "SS/CR/BIA/ABEYOONG/1/0002/05", "SS/CR/BIA/ABEYOONG/1/0002/02", "SS/CR/BIA/ABEYOONG/1/0003/01", "SS/CR/BIA/ABEYOONG/1/0003/03", "SS/CR/BIA/ABEYOONG/1/0003/05", "SS/CR/BIA/ABEYOONG/1/0003/04", "SS/CR/BIA/ABEYOONG/1/0003/02", "SS/CR/BIA/ABEYOONG/1/0004/02", "SS/CR/BIA/ABEYOONG/1/0004/07", "SS/CR/BIA/ABEYOONG/1/0004/06", "SS/CR/BIA/ABEYOONG/1/0004/05", "SS/CR/BIA/ABEYOONG/1/0004/04", "SS/CR/BIA/ABEYOONG/1/0004/03", "SS/CR/BIA/ABEYOONG/1/0004/01", "SS/CR/BIA/ABEYOONG/1/0005/01"), relationship = c(3, 3, 3, 2, 1, 1, 10, 3, 11, 2, 1, 3, 3, 3, 3, 3, 11, 3, 3, 3, 3, 1, 1)), row.names = c(NA, -23L), class = c("tbl_df", "tbl", "data.frame")) # 提取家庭ID(示例数据中ID为个人ID,你原Stata代码分组用的是家庭ID,因此先提取;如果你数据中已有家庭ID变量可直接跳过此步) df <- df %>% mutate(hh_id = substr(ID, 1, nchar(ID)-3))
步骤2:按家庭分组计算户主数量
对应Stata代码 bysort ID : egen numberhead=total(relationship==1)
df <- df %>% group_by(hh_id) %>% # 如果你自有家庭ID变量,替换此处的hh_id即可 mutate(numberhead = sum(relationship == 1, na.rm = TRUE)) %>% ungroup()
步骤3:校验所有家庭仅1个户主
对应Stata代码 assert numberhead==1
# 不符合校验规则时会直接抛出错误,效果和Stata的assert完全一致 stopifnot(all(df$numberhead == 1))
步骤4:筛选异常家庭
查看多户主家庭
对应Stata代码 list ID relationship if numberhead>=2
filter(df, numberhead >= 2) %>% select(ID, relationship)
查看无户主家庭
对应Stata代码 list ID relationship if numberhead<1
filter(df, numberhead < 1) %>% select(ID, relationship)
方法2:基础R实现(无需安装第三方包)
# 提取家庭ID,自有家庭ID可跳过此步 df$hh_id <- substr(df$ID, 1, nchar(df$ID)-3) # 按家庭分组计算户主数量 df$numberhead <- ave(df$relationship == 1, df$hh_id, FUN = sum) # 校验所有家庭仅1个户主 stopifnot(all(df$numberhead == 1)) # 查看多户主家庭 df[df$numberhead >=2, c("ID", "relationship")] # 查看无户主家庭 df[df$numberhead <1, c("ID", "relationship")]
内容的提问来源于stack exchange,提问作者Aquila
相关产品推荐
相关产品推荐

