首页 > 解决方案 > 按 R 中的条件从以前的值增加

问题描述

我正在寻找我的具体问题的答案,但我没有找到结论。

我有一个包含数据的数据框

ID  a
1   0
2   0
3   1
4   1
5   1
6   1
7   0
8   1
9   1
10  0
11  1
12  0
13  0

现在我想添加“b”列,如果 a == 1,数字会从前一个 b 增加

像这样的结果

ID  a   b
1   0   0
2   0   0
3   1   1
4   1   2
5   1   3
6   1   4
7   0   0
8   1   1
9   1   2
10  0   0
11  1   1
12  0   0
13  0   0
14  1   1
15  1   2
16  1   3
17  1   4

提前致谢!

标签: rdataframe

解决方案


这是一种使用rleid()fromdata.table创建我们在内部使用的分组变量的方法ave()。然后我们计算cumsum每组,这将是0无论何时a == 0

library(data.table)
df$new_b <- with(df, ave(a, rleid(a), FUN = cumsum))
df
#   ID a b new_b
#1   1 0 0     0
#2   2 0 0     0
#3   3 1 1     1
#4   4 1 2     2
#5   5 1 3     3
#6   6 1 4     4
#7   7 0 0     0
#8   8 1 1     1
#9   9 1 2     2
#10 10 0 0     0
#11 11 1 1     1
#12 12 0 0     0
#13 13 0 0     0
#14 14 1 1     1
#15 15 1 2     2
#16 16 1 3     3
#17 17 1 4     4

一旦data.table加载,你也可以做

setDT(df)[, new_b := cumsum(a), rleid(a)][]

数据

df <- structure(list(ID = 1:17, a = c(0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 
1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L), b = c(0L, 0L, 1L, 2L, 3L, 
4L, 0L, 1L, 2L, 0L, 1L, 0L, 0L, 1L, 2L, 3L, 4L)), .Names = c("ID", 
"a", "b"), class = "data.frame", row.names = c(NA, -17L))

推荐阅读