在R语言中若组内任意行满足条件则移除整组的实现方法
移除存在组切换的ID所有记录
需求说明
需要删除所有分组内出现过组切换(即同一ID的group值发生过变化)的ID对应的全部记录。
方法一:基于transition列筛选
先计算标记组切换的transition列,再判断每个ID是否存在切换,最后筛选出无切换的ID:
library(dplyr) # 构造原始数据 years <- c("2000", "2001", "2002", "2003", "2000", "2001", "2002", "2003") IDs <- c(1,1,1,1,2,2,2,2) group <- c("A", "A", "B", "A", "B", "B", "B", "B") people <- data.frame(years, IDs, group) # 处理逻辑 people_cleaned <- people %>% group_by(IDs) %>% # 生成transition列,首行默认无切换(标记为NO) mutate(transition = case_when( row_number() == 1 ~ "NO", group != lag(group) ~ "YES", TRUE ~ "NO" )) %>% # 标记当前ID是否存在切换 mutate(has_transition = any(transition == "YES")) %>% # 筛选无切换的ID记录 filter(!has_transition) %>% # 移除辅助列(可选) select(-transition, -has_transition) %>% ungroup() # 查看结果 print(people_cleaned)
运行结果仅保留ID=2的所有行,因为ID=1存在多次组切换。
方法二:直接判断分组内group唯一性(更简洁高效)
无需生成transition列,直接通过判断每个ID的group值是否唯一来实现需求:
library(dplyr) # 构造原始数据(同上) years <- c("2000", "2001", "2002", "2003", "2000", "2001", "2002", "2003") IDs <- c(1,1,1,1,2,2,2,2) group <- c("A", "A", "B", "A", "B", "B", "B", "B") people <- data.frame(years, IDs, group) # 简洁版处理逻辑 people_cleaned <- people %>% group_by(IDs) %>% # 仅保留group值唯一的ID(无切换) filter(n_distinct(group) == 1) %>% ungroup() # 查看结果 print(people_cleaned)
此方法利用n_distinct(group)统计分组内group的唯一值数量:若等于1,说明该ID无组切换,保留所有行;若大于1,说明存在切换,过滤整个组。
内容的提问来源于stack exchange,提问作者jerH
相关产品推荐
相关产品推荐

