You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:21:02