按负值比例过滤向量

问题描述 投票:0回答:2

我有一个带有有序负值和正值的向量:

 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
)?

r dplyr
2个回答
0
投票

使用

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

0
投票

或许你可以尝试一下

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
© www.soinside.com 2019 - 2024. All rights reserved.