R语言dplyr按ID分组条件修改dataframe的Name列值
R按ID分组统一多匹配名称的实现方法
你需要的dplyr实现逻辑非常直接,按分组判断唯一值数量后批量替换即可,完整可运行代码如下:
dplyr 实现(推荐)
# 加载dplyr包 library(dplyr) # 构造示例原始数据 df <- data.frame( Name = c("Tom", "Tom", "Tina", "Tom", "Tina", "Tina"), ID = c(1, 1, 1, 2, 3, 3) ) # 核心处理逻辑 df_processed <- df %>% group_by(ID) %>% mutate( Name = if_else( condition = n_distinct(Name) > 1, true = "Both", false = first(Name) ) ) %>% ungroup()
代码逻辑说明
group_by(ID):按ID字段对所有记录分组n_distinct(Name):统计当前分组内Name字段的去重取值个数- 若去重后个数大于1,说明同ID下对应多个不同Name,直接将整组Name赋值为
"Both" - 若去重后个数为1,说明同ID下Name完全一致,取组内第一个Name值即可(和保留所有原值效果完全相同)
ungroup():处理完成后解除数据的分组状态,避免后续分析操作受分组规则干扰
运行后得到的结果和预期输出完全一致:
| Name | ID |
|---|---|
| Both | 1 |
| Both | 1 |
| Both | 1 |
| Tom | 2 |
| Tina | 3 |
| Tina | 3 |
基础R备选实现(无需加载第三方包)
如果不想依赖dplyr,用基础R的ave()函数也可以实现相同效果:
df$Name <- ave(df$Name, df$ID, FUN = function(x) { if (length(unique(x)) > 1) return("Both") return(x[1]) })
内容的提问来源于stack exchange,提问作者Ottot
相关产品推荐
相关产品推荐

