r - 一旦累积值达到某个阈值 R 就保持行

标签 r dplyr cumsum

我有一个数据框,我想在列的累积值达到一定水平后立即保留一行。数据集可能如下所示:

set.seed(0)
n <- 10
dat <- data.frame(id=1:n, 
                  
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=factor(paste("type", 1:n)),
                  x=abs(rnorm(n)))
dat


   id group age    type           x
1   1     A  26  type 1 0.928567035
2   2     B  21  type 2 0.294720447
3   3     A  24  type 3 0.005767173
4   4     B  18  type 4 2.404653389
5   5     A  19  type 5 0.763593461
6   6     B  30  type 6 0.799009249
7   7     A  24  type 7 1.147657009
8   8     B  28  type 8 0.289461574
9   9     A  19  type 9 0.299215118
10 10     B  28 type 10 0.411510833

我想在 x 的累积值达到阈值(例如 1)后立即保留一行,并在保留一行后立即开始重新计数。这将导致以下输出:

   id group age    type           x
2   2     B  21  type 2 0.294720447
4   4     B  18  type 4 2.404653389
6   6     B  30  type 6 0.799009249
7   7     A  24  type 7 1.147657009
10 10     B  28 type 10 0.411510833

我正在尝试获得基于 dplyr 的解决方案,但似乎无法弄清楚。有什么建议吗?

最佳答案

您可以使用 purrr::accumulate 计算带阈值的 cumsum,然后使用 dplyr::slice_tail 获取 cumsum 削减阈值之前的最后一个值:

library(dplyr)
library(purrr)
dat %>% 
  group_by(a = cumsum(x == accumulate(x, ~ ifelse(.x <= 1, .x + .y, .y)))) %>% 
  slice_tail(n = 1)

#      id group   age type        x    gp
# 1     2 B        21 type 2  0.295     1
# 2     4 B        18 type 4  2.40      2
# 3     6 B        30 type 6  0.799     3
# 4     7 A        24 type 7  1.15      4
# 5    10 B        28 type 10 0.412     5

另一种选择是使用 MESS::cumsumbinning,使用起来可能更友好:

library(MESS)
library(dplyr)
dat %>% 
  group_by(a = cumsumbinning(x, 1, cutwhenpassed = T)) %>% 
  slice_tail(n = 1)

关于r - 一旦累积值达到某个阈值 R 就保持行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74094426/

相关文章:

r - 在 R 中,合并并使用向量名称作为列名称

r - 使用 map (purrr) 将参数传递给 R 自定义函数

python - 滚动列值的累积和直到满足条件

r - 我可以将单个变量的任意函数的参数拟合到数据吗?

r - 通过环境传递变量

r - 在发布到 Wordpress 时,在 KnitR 中包装 R 代码块以适应 html 的宽度

r - 重新探究data.table与dplyr的内存使用

r - 如何使用 R 的 {collapse} 包来实现正确的 fgroup_by() |> ftransform() 输出?

r - 使用 dplyr mutate 的唯一值的 cumsum

matlab - 有上限和下限的cumsum?