跨年份不同规模数据集垂直合并及唯一ID赋值问题求助
你的方法存在问题,无法保证个体ID的唯一性
你当前的做法是给每个年份的数据集单独生成ID,但cur_group_id()是在单个数据集内按分组顺序生成的,这会导致:
- 不同年份里编码重复的不同个体,会得到相同的
ID(比如2016年的(nquest=1, nord=1)和2020年的(nquest=1, nord=1),各自的ID都会是1,合并后就会被误认为是同一个体) - 完全无法区分跨年份的重复编码问题,违背了你“每个观测对应唯一个体”的需求
正确的处理方式
要解决跨年份编码重复的问题,核心是给每个个体的标识加入年份维度,因为重复编码是发生在不同年份之间的,结合年份后就能唯一区分不同个体。
步骤1:给每个数据集添加年份标签
先给每个年份的数据集加上对应的年份变量,明确观测所属的年份:
data2020 <- data2020 %>% mutate(year = 2020) data2016 <- data2016 %>% mutate(year = 2016) data2014 <- data2014 %>% mutate(year = 2014) data2012 <- data2012 %>% mutate(year = 2012)
步骤2:生成跨年份唯一的个体ID
可以选择两种方式生成唯一ID:
方式一:生成直观的字符型ID
直接将年份、家庭编码、成员编码拼接成字符串,一眼就能看出个体的年份和原始编码:
# 合并所有数据集并生成ID big_data <- bind_rows(data2020, data2016, data2014, data2012) %>% mutate(individual_id = paste(year, nquest, nord, sep = "_"))
方式二:生成紧凑的数值型ID
如果需要数值型ID用于后续分析,可在合并后按year + nquest + nord的组合分组生成:
big_data <- bind_rows(data2020, data2016, data2014, data2012) %>% group_by(year, nquest, nord) %>% mutate(individual_id = cur_group_id()) %>% ungroup()
额外:检测跨年份重复编码
你之前用ifelse检测重复时因为数据集行数不匹配出现警告,正确的检测方法是检查不同年份间的(nquest, nord)组合是否有交集:
# 以2020和2016为例,检查重复编码 common_ids <- inner_join( data2020 %>% select(nquest, nord), data2016 %>% select(nquest, nord), by = c("nquest", "nord") ) # 如果common_ids有数据,说明存在跨年份重复编码 nrow(common_ids) > 0
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

