按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
相关产品推荐
相关产品推荐

