我有一个带有有序负值和正值的向量:
x <- c(-35, -30, -25, -20, -15, -10, -5, -2, 0, 5, 22, 77)
我需要按一定比例的负值来过滤向量中的值。比如说,虽然我想保留所有正值,但我只想保留最后三分之一的负值。我确实有一个解决方案,但它看起来非常笨重:
data.frame(x) %>%
mutate(x_neg = ifelse(x < 0, x, NA),
id = consecutive_id(x_neg),
x_neg_length = length(x_neg[!is.na(x_neg)])) %>%
filter(id > x_neg_length/3*2) %>%
select(x)
x
1 -5
2 -2
3 -1
4 0
5 5
6 22
7 77
有没有更简洁/更优雅的解决方案(最好是
dplyr
)?
使用
proportions
适用于给定的示例
tibble(x) %>%
filter(cumsum(proportions(as.matrix(x < 0), 2)) > 2/3)
# A tibble: 7 × 1
x
<dbl>
1 -10
2 -5
3 -2
4 0
5 5
6 22
7 77
或许你可以尝试一下
data.frame(x) %>%
mutate(grp = consecutive_id(x < 0)) %>%
reframe(x = if (last(x) < 0) last(x, 3) else x, .by = grp) %>%
pull(x)
这给出了
[1] -10 -5 -2 0 5 22 77