R语言按条件去重求助:删除reason为age的重复id记录
解决R语言删除重复id中reason为age的记录问题
嘿,我来帮你搞定这个问题!首先咱们先理清你的需求:你想要删掉那些同一个id下reason为"age"的记录,尤其是当这个id还有其他reason(比如你的例子里的"disability")的时候,只保留非"age"的那条。
先说说你原来的代码为啥没效果:
你写的Final_data = data[which(! duplicate (id)) & which( reason=="age"),]逻辑完全搞反啦——!duplicate(id)是挑出每个id第一次出现的行,再和reason=="age"取交集,最后会保留第一次出现且reason是age的行,这和你想要的结果正好相反~
下面给你两种简单易懂的解决方案,适合R新手:
方法一:用基础R实现(无需额外安装包)
直接用R自带函数就能搞定,步骤清晰:
# 先定义你的数据集 Data = data.frame(id =c(1,1), dob=c("06/06/2018", "06/06/2018"), reason=c("age", "disability")) # 第一步:找出所有存在非"age"记录的id ids_with_non_age <- unique(Data$id[Data$reason != "age"]) # 第二步:筛选数据,只保留这些id下的非"age"记录 Final_data <- Data[Data$id %in% ids_with_non_age & Data$reason != "age", ]
运行这段代码后,你会得到只保留reason="disability"的那条记录,正好符合你的需求。
方法二:用dplyr包(语法更直观,新手友好)
dplyr是R里处理数据的热门工具,语法接近自然语言,更容易理解:
# 第一次使用需要先安装dplyr包 install.packages("dplyr") library(dplyr) # 处理数据 Final_data <- Data %>% group_by(id) %>% # 按id分组,把同一个id的记录放在一起 # 核心逻辑:如果当前组里有非"age"的记录,就只保留这些记录;如果全是"age",就删掉整个组 filter(ifelse(any(reason != "age"), reason != "age", FALSE)) %>% ungroup() # 取消分组,恢复普通数据框格式
这段代码的逻辑非常清晰:先按id分组,再对每个组做判断——只要组里存在不是"age"的记录,就留下这些有效记录;如果某个id只有"age"的记录,就直接删掉这个id的所有行。
你可以试试这两种方法,都能完美解决你的问题~
内容的提问来源于stack exchange,提问作者Umang Gureja




