r - 根据累计和和组创建新组

标签 r dplyr cumsum

我希望根据两个条件创建一个新组。我希望在 Value 的累计总和达到 10 之前将所有案例分组在一起,并且我希望在每个人中完成此操作。我已经设法让它分别适用于每个条件,但不能同时使用 for 循环和 dplyr。但是,我需要同时应用这两个条件。下面是我希望数据看起来的样子(我不需要 RunningSum_Value 列,但我保留它是为了澄清)。理想情况下,我想要一个 dplyr 解决方案,但我并不挑剔。预先感谢您!

ID     Value RunningSum_Value   Group
PersonA    1    1                 1
PersonA    3    4                 1
PersonA    10   14                1
PersonA    3    3                 2
PersonB    11   11                3
PersonB    12   12                4
PersonC    3    3                 5
PersonD    4    4                 6
PersonD    9    13                6
PersonD    5    5                 7
PersonD    11   16                7
PersonD    6    6                 8
PersonD    1    7                 8

这是我的数据:

df <- read.table(text="ID   Value
                 PersonA    1
                 PersonA    3
                 PersonA    10
                 PersonA    3
                 PersonB    11
                 PersonB    12
                 PersonC    3
                 PersonD    4
                 PersonD    9
                 PersonD    5
                 PersonD    11
                 PersonD    6
                 PersonD    1", header=TRUE,stringsAsFactors=FALSE)

最佳答案

定义函数 sum0,对其参数进行 sum 计算,但每次达到 10 或更多时输出 0。定义函数 is_start > 对于组的起始位置返回 TRUE,否则返回 FALSE。最后使用 aveis_start 应用于每个 ID 组,然后对其执行 cumsum 以获取组编号。

sum0 <- function(x, y) { if (x + y >= 10) 0 else x + y }
is_start <- function(x) head(c(TRUE, Reduce(sum0, init=0, x, acc = TRUE)[-1] == 0), -1)
cumsum(ave(DF$Value, DF$ID, FUN = is_start))
## [1] 1 1 1 2 3 4 5 6 6 7 7 8 8

更新:修复

关于r - 根据累计和和组创建新组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45621852/

相关文章:

r - 用虚拟零填充时间序列数据框

r - cumsum 与 r 中标记列的重置?

r - panel.text xyplot R

r - 如何始终确保在 R 中指定组大小的混洗样本

r - 如何在自定义包中使用 tidyselect "where"?

python - Pandas 通过重置获取累积和

r - 将列总计添加到数据框 R 中的新行

r - 包装 R 的绘图函数(或 ggplot2)以防止绘制大数据集

r - 在循环中填充 R 中的数据帧

数据框中逻辑值的逐行总和