如何用dplyr在R中筛选所有X列首次出现非零值后的行
使用dplyr筛选X1首次出现非零值后的所有行
首先构造你的示例数据:
library(dplyr) df <- tibble( date = c("1/1", "2/1", "3/1", "4/1", "5/1", "6/1", "7/1"), X1 = c(0, 0, 0, 25, 35, 4, 0), X2 = c(3, 7, 13, 4, 0, 6, 0), X3 = c(34, 65, 0, 65, 0, 9, 0) )
核心解决方案
利用cumany()函数实现“首次满足条件后保留所有后续行”的逻辑:
df %>% filter(cumany(X1 != 0))
结果输出
执行后会得到你需要的行:
| date | X1 | X2 | X3 |
|---|---|---|---|
| 4/1 | 25 | 4 | 65 |
| 5/1 | 35 | 0 | 0 |
| 6/1 | 4 | 6 | 9 |
| 7/1 | 0 | 0 | 0 |
逻辑说明
X1 != 0:判断每行的X1是否为非零值cumany():累积判断,一旦某行满足X1 != 0,后续所有行都会返回TRUE,从而被筛选保留
扩展:适配所有X列的情况
如果你的需求是任意X列首次出现非零值后保留所有行(可作为通用场景参考),可以用starts_with("X")匹配所有X开头的列:
df %>% filter(cumany(if_any(starts_with("X"), ~ .x != 0)))
内容的提问来源于stack exchange,提问作者Telis
相关产品推荐
相关产品推荐

