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

基于相同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)

代码逻辑说明

  1. 缺失值转换:原始数据用空字符串""表示缺失,先转为R标准缺失值NA,方便使用n_distinct、na.omit等函数处理。
  2. 分组判断与处理:
    • 按ID分组后,用n_distinct(..., na.rm = TRUE)统计每组内变量的非缺失唯一值数量。
    • 若唯一值数量为1,说明无冲突,用first(na.omit(.x))提取该唯一值,填充组内所有行的新列。
    • 若唯一值数量大于1,说明存在值冲突,新列直接保留原变量的原始值(包括缺失和非缺失)。
  3. 格式还原:最后将NA转回空字符串,确保输出格式与原始数据一致。

运行代码后生成的new_table完全匹配你给出的输出示例,同时保留了所有原始行记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:02:47