如何使用ifelse语句过滤Age为0时重复测量的首行数据
问题描述
我有一个DataFrame(df),数据如下:
| ID | Age | Measurement |
|---|---|---|
| 1 | 1 | 23.5 |
| 1 | 2 | 24.5 |
| 1 | 3 | 25.0 |
| 2 | 0 | 10.0 |
| 2 | 0 | 11.5 |
| 2 | 1 | 23.5 |
| 2 | 2 | 25.5 |
| 3 | 0 | 9.5 |
| 3 | 1 | 20.0 |
| 4 | 0 | 10.5 |
| 4 | 0 | 11.0 |
| 4 | 1 | 23.5 |
| 4 | 2 | 26.5 |
| 4 | 3 | 27.5 |
我的需求是:当Age为0且存在重复的Age=0的测量记录时,过滤掉该组中的第一个测量行。
我尝试了以下代码,但不知道如何正确实现:
df %>% ifelse(Age == 0, lead(Age) == 0, slice(-1), *Do nothing*)
解决方案
可以通过分组标记的方式精准过滤目标行,具体代码如下:
library(dplyr) df_filtered <- df %>% # 按ID和Age分组,锁定每个ID下Age=0的重复组 group_by(ID, Age) %>% # 生成组内行数和行号两个临时辅助列 mutate( group_count = n(), row_in_group = row_number() ) %>% # 过滤规则:保留非Age=0的行,或Age=0但组内仅一行的行,或Age=0但不是组内第一行的行 filter( Age != 0 | (Age == 0 & group_count == 1) | (Age == 0 & row_in_group != 1) ) %>% # 移除临时辅助列,还原原数据结构 select(-group_count, -row_in_group) %>% ungroup()
代码说明
group_by(ID, Age):确保我们只针对同一ID下的同一年龄组做判断,避免跨ID干扰mutate生成的两个列:group_count用来判断该Age=0组是否有重复记录,row_in_group用来定位组内的第一行filter条件精准匹配需求,只剔除那些"属于重复Age=0组的第一行"- 最后移除临时列,得到干净的过滤后数据
执行后,ID=2和ID=4中Age=0的第一行会被剔除,ID=3中唯一的Age=0行会保留,其余非Age=0的行全部保留。
内容的提问来源于stack exchange,提问作者KellyForrester
相关产品推荐
相关产品推荐

