gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:49:24 33 4
gpt4 key购买 nike

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

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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com