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

R语言中移除ID相同但plan列值不同行的优雅实现方法

优雅实现:保留ID与plan唯一匹配的行

嘿,这个需求在数据清洗里挺常见的,我这里有两种简洁的实现方式,分别用tidyverse(dplyr)和base R,你可以根据自己的习惯选:

方法一:用dplyr(推荐,代码更易读)

如果你平时用tidyverse的话,这个方法非常直观,通过分组筛选就能搞定:

library(dplyr)

# 假设你的原始数据框叫df
clean_df <- df %>%
  group_by(ID) %>%          # 按ID分组
  filter(n_distinct(plan) == 1) %>%  # 只保留每个组里plan唯一的行
  ungroup()                 # 取消分组(可选,但好习惯)

补充:如果想每个ID只留一行(即使同一ID有多个相同plan的行)

要是你不仅要去掉ID对应多plan的行,还想把同一ID重复的相同plan行也只留一行,可以加个distinct步骤:

clean_df <- df %>%
  group_by(ID) %>%
  filter(n_distinct(plan) == 1) %>%
  distinct(ID, plan, .keep_all = TRUE) %>%  # 保留唯一的ID-plan组合,带其他列
  ungroup()

方法二:用base R(不用额外装包)

如果不想加载任何包,用base R的ave函数也能轻松实现:

# 先计算每个ID对应的plan唯一值数量
unique_plan_per_id <- ave(as.character(df$plan), df$ID, FUN = function(x) length(unique(x)))

# 筛选出数量为1的行,得到目标数据框
clean_df <- df[unique_plan_per_id == 1, ]

补充:同样实现每个ID只留一行

要是需要进一步去重,结合duplicated就行:

unique_plan_per_id <- ave(as.character(df$plan), df$ID, FUN = function(x) length(unique(x)))
temp_df <- df[unique_plan_per_id == 1, ]
clean_df <- temp_df[!duplicated(temp_df[c("ID", "plan")]), ]

这两种方法都能完美达到你的需求,去掉所有ID相同但plan不同的行,只留下ID和plan匹配唯一的行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:00:41