在 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
考虑以下小标题:
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