You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动