在一个tibble中扩展过滤

时间:2018-03-13 07:57:19

标签: r tidyverse

考虑以下因素:

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

我想只选择 a 中的某些行:即我想从 a 顶部删除行,直到第一个剩余行具有非负值在val。 所以在我上面的例子中,我想删除前两行(因为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内部有一个更优雅的解决方案。任何提示? 谢谢。

1 个答案:

答案 0 :(得分:1)

我们可以对非0的逻辑向量(cumsum)和val >=0)元素使用slice

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