r - 如何在 R 中对具有给定条件(累积和)的数据进行分组?
问题描述
我想对行进行分组,直到累计总数超过 200。
如果值超过 200,我们要创建一个新组。
这是一个数据集:
data = data.frame(c(0,110,1011,1014,622,1,3,1173,3,6))
colnames(data)<-c("data")
data
1 0
2 110
3 1011
4 1014
5 622
6 1
7 3
8 1173
9 3
10 6
11 199
12 1
13 200
我想要的是:
data$group<-c(1,1,2,3,4,5,5,6,7,7)
data group
1 0 1 #(cum:0, group:1)
2 110 1 #(cum:110,group:1)
3 1011 2 #(cum:1011, if the value exceeds the 200, assign new group, group: 2)
4 1014 3 #(cum:1011, if the value exceeds the 200, assign new group, group: 3)
5 622 4 #(cum:622, if the value exceeds the 200, assign new group, group: 4)
6 1 5 #(cum:1, re-start, group: 5)
7 3 5 #(cum:4, re-start, group: 5)
8 1173 6 #(cum:6, if the value exceeds the 200, assign new group, group: 4)
9 3 7 #(cum:3, re-start, group: 7)
10 6 7 #(cum:9, re-start, group: 7)
11 199 8
12 1 8
13 200 9
解决方案
这是一个用户功能f
,可能有助于按照您的描述进行分组
f <- function(v, threshold = 200) {
grp <- c()
cnt <- 1
while (length(v)) {
n <- sum(cumsum(v) <= threshold)
grp <- c(grp, rep(cnt, max(n, 1)))
v <- v[-(1:max(n, 1))]
cnt <- cnt + 1
}
grp
}
这使
> within(data, group <- f(data))
data group
1 0 1
2 110 1
3 1011 2
4 1014 3
5 622 4
6 1 5
7 3 5
8 1173 6
9 3 7
10 6 7
11 199 8
12 1 8
13 200 9
推荐阅读
- javascript - 为什么 setTimeout 用于 Javascript 中的计数器动画?
- python - Django Postgres ArrayField(models.IntegerField) 迁移错误
- android - Android:带有选项卡布局的导航组件
- r - 从 cv.glmnet 中提取拟合值、残差和汇总统计数据
- ios - 将 AppDelegate 类导航到另一个 ViewController
- python - 为什么自我避免步行的代码不起作用?
- java - 一个类和两个子类但不使用继承的设计模式
- java - 如何查看我在 netbeans 中使用的包的源代码?
- python - 如何在python中自动命名数据框
- apache-kafka - kafka-server-start.bat 未运行且未报告日志