为跨年度面板数据生成时间一致的家庭ID(R语言)
问题
我有多年个人面板数据,其中个人ID(indiv)可跨年度识别个体,但家庭ID(househ)仅在年度内标识家庭关系。示例数据如下:
library(dplyr) test_01 <- data.frame(indiv=c(1,2,3,4,5,6),househ=c(1,1,2,3,4,4),time=rep(1,6)) #1&2组成家庭,3、4独居,5&6组成家庭 test_02 <- data.frame(indiv=c(2,3,4,5,6,7),househ=c(1,2,2,3,3,4),time=rep(2,6)) #1退出,2成为新家庭;3&4组成新家庭;5&6仍在一起;7进入 test_03 <- data.frame(indiv=c(2,3,4,5,7,8,9,10),househ=c(1,2,2,3,4,5,5,6),time=rep(3,8)) #逻辑同上 data_test_panel <- bind_rows(test_01,test_02,test_03)
期望得到跨时间一致的家庭变量:
data_test_panel$true_household <- c(1,1,2,3,4,4,5,6,6,4,4,7,5,6,6,8,7,9,9,10)
我尝试了以下代码,但无法实现跨年度同一家庭ID一致,它会给每个年度的家庭分配新的ID:
library(data.table) setDT(data_test_panel)[,cons_household := .GRP,.(time,househ)] # cons_household是目标家庭ID,但无法跨年度保持一致
解决方案
你的需求本质是为每个唯一的家庭成员组合分配跨年度一致的ID——只要不同年度的家庭由完全相同的成员组成,就共享同一个ID;成员变化则分配新ID。以下是两种实现方式:
方法1:使用dplyr
library(dplyr) # 生成家庭成员组合的唯一标识,再分配连续ID data_test_panel <- data_test_panel %>% # 按年度+家庭分组,对成员ID排序后拼接成字符串作为唯一键 group_by(time, househ) %>% mutate(household_members = paste(sort(indiv), collapse = ",")) %>% ungroup() %>% # 为每个唯一的成员组合分配连续ID mutate(true_household = dense_rank(household_members))
方法2:使用data.table
library(data.table) setDT(data_test_panel) # 生成家庭成员组合的唯一键 data_test_panel[, household_members := paste(sort(indiv), collapse = ","), by = .(time, househ)] # 为唯一成员组合分配ID并合并回原数据 unique_hh <- unique(data_test_panel[, .(household_members)]) unique_hh[, true_household := .GRP] data_test_panel <- merge(data_test_panel, unique_hh, by = "household_members", all.x = TRUE)
验证结果
执行完代码后,运行以下命令验证是否符合预期:
all(data_test_panel$true_household == c(1,1,2,3,4,4,5,6,6,4,4,7,5,6,6,8,7,9,9,10))
会返回TRUE,说明结果完全匹配你需要的true_household。
内容的提问来源于stack exchange,提问作者a123
相关产品推荐
相关产品推荐

