gpt4 book ai didi

r - 带重置的条件累加

转载 作者:行者123 更新时间:2023-12-03 23:47:38 25 4
gpt4 key购买 nike

我有一个数据框,该数据框已经根据需要进行了排序,但现在我想将其“切片”成组。

此组的最大累积值应为 10。当累积值 > 10 时,应重置累积总和并重新开始

library(dplyr)
id <- sample(1:15)
order <- 1:15
value <- c(4, 5, 7, 3, 8, 1, 2, 5, 3, 6, 2, 6, 3, 1, 4)
df <- data.frame(id, order, value)
df

这是我正在寻找的输出(我是“手动”完成的)
cumsum_10  <- c(4, 9, 7, 10, 8, 9, 2, 7, 10, 6, 8, 6, 9, 10, 4)
group_10 <- c(1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7)
df1 <- data.frame(df, cumsum_10, group_10)
df1

所以我有两个问题
  • 如何创建每次超过上限(在本例中为 10)时重置的累积变量
  • 如何对每组进行计数/分组

  • 对于第一部分,我尝试了 group_by 和 cumsum 的一些组合,但没有运气
    df1 <- df %>% group_by(cumsum(c(False, value < 10)))

    我更喜欢管道 (%>%) 解决方案而不是 for 循环

    谢谢

    最佳答案

    我认为这不容易矢量化......至少我不知道如何。

    你可以做到by hand通过:

    my_cumsum <- function(x){
    grp = integer(length(x))
    grp[1] = 1
    for(i in 2:length(x)){
    if(x[i-1] + x[i] <= 10){
    grp[i] = grp[i-1]
    x[i] = x[i-1] + x[i]
    } else {
    grp[i] = grp[i-1] + 1
    }
    }
    data.frame(grp, x)
    }

    对于您的数据,这给出:
    > my_cumsum(df$value)
    grp x
    1 1 4
    2 1 9
    3 2 7
    4 2 10
    5 3 8
    6 3 9
    7 4 2
    8 4 7
    9 4 10
    10 5 6
    11 5 8
    12 6 6
    13 6 9
    14 6 10
    15 7 4

    同样对于我的“反例”,这给出了:
    > my_cumsum(c(10,6,4))
    grp x
    1 1 10
    2 2 6
    3 2 10

    正如@Khashaa 指出的,这可以通过 Rcpp 更有效地实现。 .他链接到这个答案 How to speed up or vectorize a for loop?我觉得这非常有用

    关于r - 带重置的条件累加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34531568/

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