如何用dplyr保留每个id分组中首个1及之前的行?
使用dplyr实现按分组保留第一个值为1的行及之前的所有行
我们需要对data.frame按id分组,删除每个分组中第一个出现值为1的行之后的所有行,同时保留该行及之前的行。
数据复现代码
df <- structure(list(id = c("a", "a", "a", "a", "a", "b", "b", "b", "b"), x = c(0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L)), class = "data.frame", row.names = c(NA, -9L))
解决方案
可以用dplyr的分组+切片方法,直接定位每个组中第一个值为1的行的位置,提取从开头到该位置的所有行:
library(dplyr) result <- df %>% group_by(id) %>% slice(1:which(x == 1)[1]) %>% ungroup() print(result)
输出结果
# A tibble: 5 × 2 id x <chr> <int> 1 a 0 2 a 0 3 a 1 4 b 0 5 b 1
扩展:处理无值为1的分组
如果需要兼容某些分组中没有值为1的情况(保留整个分组),可以调整代码:
result <- df %>% group_by(id) %>% slice(1:ifelse(any(x == 1), which(x == 1)[1], n())) %>% ungroup()
内容的提问来源于stack exchange,提问作者aerw4
相关产品推荐
相关产品推荐

