使用distinct()去重RESPNO时丢失唯一项目ID的解决方法
问题:去重受访者ID时保留全部项目ID
我尝试用distinct()去除重复的受访者ID(RESPNO),但操作后原本的250个唯一项目ID(ID)只剩31个。项目ID允许重复,但受访者ID不能重复。
数据合并与去重代码
我先合并援助项目数据集AidData和调查数据集OpinionData:
Full_dataset <- merge(AidData, OpinionData, by = "Recipient")
合并后生成的数据集包含250个唯一项目ID和46860个受访者ID,我用以下代码生成示例并执行去重:
set.seed(42) # 生成行数 n_rows <- 386378 Full_dataset <- data.frame( "ID" = rep(1:250, length.out = n_rows, each = ceiling(n_rows/250)), "RESPNO" = rep(1:46860, length.out = n_rows), "Recipient" = sample(c("Angola", "Benin", "Peru", "UK", "South Africa", "Congo", "Mali", "India", "Greece"), n_rows, replace = TRUE), "Mitigation" = runif(n_rows, 0, 100), "Adaptation" = runif(n_rows, 0, 100), "Fossil_Fuel" = runif(n_rows, 0, 100) ) # 去重受访者ID Full_dataset <- Full_dataset %>% distinct(RESPNO, .keep_all = TRUE)
用这段代码确认项目ID数量:
result <- Full_dataset %>% group_by(ID) %>% summarise(count = n()) %>% ungroup() %>% arrange(desc(count)) result
现在需要解决的核心问题:如何用distinct()去重RESPNO的同时保留全部250个唯一项目ID?
解决方案
问题根源
distinct(RESPNO, .keep_all = TRUE)会为每个RESPNO保留第一行匹配的数据,而大量项目ID仅出现在被丢弃的重复RESPNO行中,最终导致项目ID大量丢失。
方法1:合并前先清理调查数据(推荐)
最合理的方式是先确保调查数据中每个受访者ID唯一,再与项目数据合并,从根源避免重复受访者记录,同时保留所有项目ID:
# 先对调查数据去重,确保每个RESPNO仅出现一次 OpinionData_clean <- OpinionData %>% distinct(RESPNO, .keep_all = TRUE) # 再合并两个数据集 Full_dataset <- merge(AidData, OpinionData_clean, by = "Recipient")
方法2:已合并数据集的补救处理
如果已经完成合并,可通过分组聚合的方式,为每个受访者保留其对应的所有项目ID,同时保证受访者唯一:
Full_dataset_clean <- Full_dataset %>% group_by(RESPNO) %>% summarise( # 收集该受访者对应的所有唯一项目ID ID = list(unique(ID)), # 保留受访者对应的国家(假设同一受访者的Recipient一致) Recipient = first(Recipient), # 针对指标可选择聚合方式,比如均值/第一个值,根据需求调整 Mitigation = mean(Mitigation), Adaptation = mean(Adaptation), Fossil_Fuel = mean(Fossil_Fuel) ) %>% ungroup()
处理后每个RESPNO仅一条记录,ID列存储该受访者对应的所有项目ID,所有250个项目ID都会保留在数据集中。
内容的提问来源于stack exchange,提问作者Forrest
相关产品推荐
相关产品推荐

