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

