在 tibble 中扩展过滤

extending filtering in a tibble

考虑以下小标题:

library(tidyverse)
a <- tibble(id = 1:5, val = c(-1,-2,0,1,-1))

我只想 select a 中的某些行:即我想从 a[=22= 的顶部删除行] 直到剩下的第一行在 val 中有一个 non-negative 值。 所以在我上面的例子中,我想删除前两行(因为那里的 val 是负数)然后保留所有后续行。

我设法找到了解决方法:

idx <- which(a$val >= 0) %>% min()
a %>% slice(idx:nrow(a))
# A tibble: 3 x 2
     id   val
  <int> <dbl>
1     3  0   
2     4  1.00
3     5 -1.00

我觉得在 tidyverse 中有一个更优雅的解决方案。有什么提示吗? 谢谢。

我们可以在逻辑向量 (val >=0)) 和非 0

slice 元素上使用 cumsum
a %>% 
  slice(which(cumsum(val >=0)!=0))

filter

a %>%
  filter(cumsum(val>=0) > 0)
# A tibble: 3 x 2
#     id   val
#   <int> <dbl>
#1     3  0   
#2     4  1.00
#3     5 -1.00