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

按ID聚合数据:将不一致列替换为'missing'的R技术问题

按ID聚合数据并处理字段不一致值

需求说明

按ID对多观测数据进行聚合,规则如下:

  • 若同一ID下某字段的所有观测值完全一致,保留该值
  • 若存在不一致,将该字段值替换为missing

原始数据

ID <- c("1234", "1234", "1242", "1456", "1234", "1242", "1234", "1234")
MEMBER_GENDER <- c("M", "M","F", "F", "M", "M", "M", "M")
RELATIONSHIP_TYPE_CODE <- c("1","1", "2", "3", "3", "2", "4" ,"3")
data <- data.frame(cbind(ID,MEMBER_GENDER, RELATIONSHIP_TYPE_CODE))

原始数据展示:

ID MEMBER_GENDER RELATIONSHIP_TYPE_CODE
1 1234             M                      1
2 1234             M                      1
3 1242             F                      2
4 1456             F                      3
5 1234             M                      3
6 1242             M                      2
7 1234             M                      4
8 1234             M                      3

期望结果

ID2 <- c("1234", "1242", "1456")
MEMBER_GENDER2 <- c("M", "missing", "F")
RELATIONSHIP_TYPE_CODE2 <- c("missing", "2", "3")
data2 <- data.frame(cbind(ID2,MEMBER_GENDER2, RELATIONSHIP_TYPE_CODE2))

期望结果展示:

ID2 MEMBER_GENDER2 RELATIONSHIP_TYPE_CODE2
1 1234             M                missing
2 1242       missing                      2
3 1456             F                      3

当前尝试的问题

使用aggregate(.~ID, data=data, FUN=unique)得到的结果中,多值字段以逗号分隔,无法直接替换为missing:

ID MEMBER_GENDER RELATIONSHIP_TYPE_CODE
1 1234             M                1, 3, 4
2 1242          F, M                      2
3 1456             F                      3

解决方案

方法1:使用dplyr包(语法直观,推荐)

先安装并加载dplyr,按ID分组后对每个字段判断唯一值数量:

# 安装并加载dplyr
install.packages("dplyr")
library(dplyr)

data_result <- data %>%
  group_by(ID) %>%
  summarise(
    MEMBER_GENDER = ifelse(n_distinct(MEMBER_GENDER) == 1, first(MEMBER_GENDER), "missing"),
    RELATIONSHIP_TYPE_CODE = ifelse(n_distinct(RELATIONSHIP_TYPE_CODE) == 1, first(RELATIONSHIP_TYPE_CODE), "missing")
  )

# 查看结果
data_result

运行结果:

# A tibble: 3 × 3
  ID    MEMBER_GENDER RELATIONSHIP_TYPE_CODE
  <chr> <chr>         <chr>                 
1 1234  M             missing               
2 1242  missing       2                     
3 1456  F             3                     

方法2:使用Base R实现

自定义聚合函数,判断唯一值数量后返回对应结果:

# 定义聚合函数
agg_func <- function(x) {
  unique_vals <- unique(x)
  if (length(unique_vals) == 1) {
    return(unique_vals)
  } else {
    return("missing")
  }
}

# 应用聚合函数
data_result_base <- aggregate(. ~ ID, data = data, FUN = agg_func)

# 查看结果
data_result_base

运行结果:

ID MEMBER_GENDER RELATIONSHIP_TYPE_CODE
1 1234             M                missing
2 1242       missing                      2
3 1456             F                      3

内容的提问来源于stack exchange,提问作者Rachel Parent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:20:32