根据累计金额和组创建新组

时间:2017-08-10 19:15:16

标签: 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)

1 个答案:

答案 0 :(得分:2)

定义函数sum0,它对其参数执行sum,除了每次达到10或更多它输出0.定义函数is_start,它返回TRUE作为开始位置一组,否则为FALSE。最后,使用is_startave应用于每个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

更新:修复