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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:04:49