我希望根据两个条件创建一个新组。我希望在 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。最后申请is_start
每个 ID 组使用ave
然后执行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
UPDATE: fix
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)