基于相同ID整合多行列数据:处理值一致与冲突场景
解决方案(R语言)
可以使用dplyr包实现需求,核心逻辑是按ID分组后,判断每组内变量的非缺失值是否唯一,再分别处理:
library(dplyr) # 定义原始数据 table <- data.frame( ID = c("A2", "A2", "A2", "B2", "B2", "C3", "C4", "D7", "D7", "D7", "E5", "E5", "E5", "E5", "F3"), Age = c("", 32, 32, "", 29, 43, 23, 34, "", 34, 24, "", "", 24, 35), Colour = c("Blue", "", "Pink", "Red", "Red", "Green", "Blue", "", "Yellow", "", "Purple", "Blue", "", "", "Orange"), stringsAsFactors = FALSE ) # 步骤1:将空字符串转为NA,便于缺失值处理 table_clean <- table %>% mutate(across(c(Age, Colour), ~ ifelse(.x == "", NA, .x))) # 步骤2:分组生成新列 new_table <- table_clean %>% group_by(ID) %>% mutate( # 处理Age_New:非缺失值唯一则全组填充,否则保留原值 Age_New = case_when( n_distinct(Age, na.rm = TRUE) == 1 ~ first(na.omit(Age)), TRUE ~ Age ), # 处理Colour_New:逻辑同Age_New Colour_New = case_when( n_distinct(Colour, na.rm = TRUE) == 1 ~ first(na.omit(Colour)), TRUE ~ Colour ) ) %>% ungroup() %>% # 步骤3:将NA转回空字符串,匹配原始数据格式 mutate(across(c(Age, Colour, Age_New, Colour_New), ~ ifelse(is.na(.x), "", .x))) # 查看结果 print(new_table)
代码逻辑说明
- 缺失值转换:原始数据用空字符串
""表示缺失,先转为R标准缺失值NA,方便使用n_distinct、na.omit等函数处理。 - 分组判断与处理:
- 按
ID分组后,用n_distinct(..., na.rm = TRUE)统计每组内变量的非缺失唯一值数量。 - 若唯一值数量为1,说明无冲突,用
first(na.omit(.x))提取该唯一值,填充组内所有行的新列。 - 若唯一值数量大于1,说明存在值冲突,新列直接保留原变量的原始值(包括缺失和非缺失)。
- 按
- 格式还原:最后将
NA转回空字符串,确保输出格式与原始数据一致。
运行代码后生成的new_table完全匹配你给出的输出示例,同时保留了所有原始行记录。
内容的提问来源于stack exchange,提问作者smicaela
相关产品推荐
相关产品推荐

