如何基于nquest和nord两列查找重复观测并统计个体多tpens值
问题解决:基于家庭编码与身份标识统计个体重复观测及多收入值情况
数据集样本
> head(dataset, 20) nquest nord tpens 1 173 1 1800 2 633 1 300 3 633 1 600 4 923 1 500 5 2886 1 1211 6 2886 2 2100 7 5416 1 700 8 7886 1 1800 9 7886 1 200 10 20297 1 1200 11 20711 2 2000 12 22169 1 600 13 22169 1 280 14 22173 2 1000 15 22276 1 1200 16 22286 1 850 17 22286 2 650 18 22657 1 1400 19 22657 2 1500 20 23490 1 1400
变量说明
nquest:个体所属家庭的编码nord:个体在家庭中的身份(1=丈夫,2=妻子,3=子女等)tpens:个体的收入
需求与问题
需要完成两个任务:
- 找出由
nquest和nord共同标识的个体中,存在多个不同tpens值的记录 - 统计每个个体对应的观测数量
之前尝试的代码逻辑错误,dataset$nquest & dataset$nord是对两列做逻辑与运算,而非将两列作为组合键判断重复,所以无法得到正确结果:
dim(dataset[duplicated(dataset$nquest & dataset$nord),])[1] sum(duplicated(dataset$nquest & dataset$nord))
解决方法
方法一:Base R原生实现
1. 统计每个个体的观测数量
用aggregate函数按nquest和nord分组统计:
# 统计每个个体的观测数 obs_count <- aggregate(tpens ~ nquest + nord, data = dataset, FUN = length) # 重命名列名更清晰 colnames(obs_count) <- c("nquest", "nord", "observation_count")
2. 识别存在多个不同tpens值的个体
通过分组计算去重后的tpens数量,筛选出数量大于1的个体:
# 计算每个个体的不同tpens值数量 unique_tpens_count <- aggregate(tpens ~ nquest + nord, data = dataset, FUN = function(x) length(unique(x))) colnames(unique_tpens_count) <- c("nquest", "nord", "unique_tpens_count") # 筛选有多个不同收入值的个体 multiple_tpens_individuals <- subset(unique_tpens_count, unique_tpens_count > 1)
3. 合并结果(可选)
把观测数和收入值数合并,同时标记是否存在多收入值:
result <- merge(obs_count, unique_tpens_count, by = c("nquest", "nord")) result$has_multiple_tpens <- result$unique_tpens_count > 1
方法二:dplyr包实现(更简洁)
如果熟悉tidyverse语法,用dplyr的分组汇总操作更高效:
library(dplyr) # 一步完成分组统计与标记 result <- dataset %>% group_by(nquest, nord) %>% summarise( observation_count = n(), unique_tpens_count = n_distinct(tpens), has_multiple_tpens = unique_tpens_count > 1 ) %>% ungroup() # 查看有多个不同tpens值的个体 filter(result, has_multiple_tpens)
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

