在R中使用条件语句过滤分组数据的技术求助
解决分组数据框的行过滤问题
先看你的原始数据:
id <- c(1,1,1,2,3,3,4,4,4,5,5,6) x <- c(0,1,0,0,1,1,0,0,1,0,0,1) df <- data.frame(id, x)
你的需求是:每个id组中,若存在x=1,则删除该组中第一个1之前的所有0行;若组内没有1,则保留所有行。
你之前的代码逻辑有误,first(x)==1 | x == 0的判断无法区分「1之前的0」和「1之后的0」,所以得不到预期结果。
正确的dplyr实现代码
library(dplyr) df_result <- df %>% group_by(id) %>% filter( # 有1的组保留第一个1及之后的行;无1的组保留全部行 cumsum(x == 1) > 0 | all(x == 0) ) %>% ungroup() print(df_result)
代码逻辑解释
cumsum(x == 1):对每个组内的x列,遇到1时累加计数,第一个1之后的所有行,这个值都会大于0;而第一个1之前的0,这个值为0。all(x == 0):判断当前组是否全为0,若是则保留所有行。- 两者用
|组合,正好匹配你的需求。
运行后得到的结果和你预期一致:
# A tibble: 9 × 2 id x <dbl> <dbl> 1 1 1 2 1 0 3 2 0 4 3 1 5 3 1 6 4 1 7 5 0 8 5 0 9 6 1
内容的提问来源于stack exchange,提问作者T Richard
相关产品推荐
相关产品推荐

