R语言:移除含code='A'的所有id的正确实现方法咨询
解决R语言中移除包含特定code的id所有行的问题
我明白你的需求啦——只要某个id下有任意一行的code是"A",就把这个id的所有行都删掉,只保留那些完全没有"A"的id的记录。你之前用的DF %>% group_by(id) %>% filter(!(code=="A"))之所以不对,是因为它只是在每个id组里去掉了code为"A"的那一行,而没有把整个有"A"的组都移除,所以id=1的B行、id=3的NA行才会留下来。
下面给你两种正确的实现方法,都用dplyr包来完成:
方法1:先筛选合法id,再过滤数据框
先统计每个id是否存在code="A"的记录,把没有"A"的id筛选出来,再用这个id列表去过滤原数据框:
library(dplyr) # 先创建你的数据框 DF <- data.frame(id=c(1,1,2,3,3),code=c("A","B","E","NA","A")) # 第一步:找出所有没有出现过code="A"的id valid_ids <- DF %>% group_by(id) %>% summarise(has_A = any(code == "A")) %>% # 判断每个id是否有A filter(!has_A) %>% # 保留没有A的id pull(id) # 提取id值成向量 # 第二步:用合法id过滤原数据 result <- DF %>% filter(id %in% valid_ids)
方法2:分组后直接过滤整个组
这种方法更简洁,直接在分组后判断该组是否存在"A",如果存在就过滤掉整个组:
result <- DF %>% group_by(id) %>% filter(!any(code == "A")) %>% # 过滤掉所有包含A的组 ungroup() # 取消分组,避免后续操作受分组影响
两种方法运行后都会得到你想要的结果:
result # id code # 1 2 E
另外注意你的数据里的"NA"是字符串类型,不是R里的缺失值NA,所以判断code == "A"是没问题的,如果是真实缺失值的话,需要额外处理,但这里不用操心~
内容的提问来源于stack exchange,提问作者hklovs
相关产品推荐
相关产品推荐

