r - 按 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
提前致谢!
解决方案
这是一种使用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))
推荐阅读
- html - 将背景应用于跨度 - 但不是文本所在的位置
- php - 在php中下载大文件的正确方法
- go - Go 中的 len(string) 和 len(slice)s O(1) 操作吗?
- python - python解析json文件
- javascript - 如何在节点 js 中检查文本框 id 是否为空
- azure-machine-learning-service - 如何从本地部署的 AzureML 容器中公开端口?
- reactjs - 如果它在对象内部,如何更新 redux reducer 中的值
- javascript - React-select {creatable} 与用户输入的条目一起工作,因为只显示没有选项
- firebase - 是否可以将通配符与斜杠之间的其他文本或通配符组合为 Firestore 规则中 get() 或 exists() 路径的一部分?
- json - Powershell - 大括号内大括号的 JSON 语法