如何按分组删除数据框指定列特定值首次出现前的所有行
实现方法
方法1:使用dplyr(tidyverse生态,写法简洁易读)
核心逻辑是按指定列分组后,对目标值的匹配结果做累加,筛选累加值≥1的行即可。
先构造示例数据:
df <- read.table(text = " a b x 1 1 NA 1 2 NA 1 3 1 1 4 0 1 5 0 1 6 NA 1 7 NA 2 1 NA 2 2 NA 2 3 1 2 4 NA 2 5 0 2 6 0 2 7 NA 3 1 NA 3 2 NA 3 3 NA 3 4 NA 3 5 1 3 6 0 3 7 NA ", header = TRUE)
执行过滤代码:
library(dplyr) result <- df %>% group_by(a) %>% filter(cumsum(x == 1 & !is.na(x)) >= 1) %>% ungroup()
方法2:使用data.table(性能更优,适合大数据量场景)
library(data.table) setDT(df) result <- df[, .SD[cumsum(x == 1 & !is.na(x)) >= 1], by = a]
逻辑说明
- 分组内逐行判断
x是否等于1,匹配成功返回1,匹配失败/值为NA时返回0 - 对判断结果做累加,第一次出现目标值1时累加值变为1,后续所有行的累加值都≥1
- 筛选累加值≥1的行,就自动排除了首次出现目标值前的所有行,首次出现后的NA和其他值都会正常保留,完全符合需求预期。
内容的提问来源于stack exchange,提问作者Pegi
相关产品推荐
相关产品推荐

