我需要根据滚动总和为数据集分配唯一的组名。示例DATA
表应说明我的问题,并查看RESULT
表以获取所需结果。
DATA
表有两个Rivers
,每行是每个River
的采样位置。我需要计算Km_inbetween
的滚动总和,当滚动总和超过50时,为这些行分配一个组名。然后,重复从下一行开始滚动和的过程。
例如,在RESULTS
表格中,Ohio River
总和的前四行总和大于50,并被指定为Group 1
。但是,接下来两行的滚动总和超过50,并被指定为Group 2
。请注意,GROUP
的{{1}}名称会重新开始。
首选使用Missouri River
的解决方案,但欢迎所有建议。在此先感谢您的时间。
dplyr
表:
DATA
Rivers Km_inbetween
Ohio 6
Ohio 7
Ohio 34
Ohio 17
Ohio 47
Ohio 5
Ohio 5
Ohio 3
Ohio 5
Ohio 19
Ohio 11
Ohio 12
Missouri 11
Missouri 10
Missouri 34
Missouri 19
Missouri 5
Missouri 19
Missouri 19
表:
RESULTS
答案 0 :(得分:1)
我认为这种方法接近你想要的。
它使用dplyr
到group_by
Rivers
,计算每条河流的cumsum()
,并使用滚动总和上的cut()
来定义群组。
data <- data.frame(Rivers = c(rep("Ohio", 12), rep("Missouri", 7)), Km_inbetween = c(6,7,34,17,47,5,5,3,5,19,11,12,11,10,34,19,5,19,19))
data %>%
group_by(Rivers) %>%
mutate(cs = cumsum(Km_inbetween)) %>%
mutate(group = cut(cs, breaks = c(0,50,100,150,200), labels = c(1,2,3,4))) %>%
mutate(group = as.numeric(as.character(group)))
这导致:
Rivers Km_inbetween cs group
<fctr> <dbl> <dbl> <dbl>
1 Ohio 6 6 1
2 Ohio 7 13 1
3 Ohio 34 47 1
4 Ohio 17 64 2
5 Ohio 47 111 3
6 Ohio 5 116 3
7 Ohio 5 121 3
8 Ohio 3 124 3
9 Ohio 5 129 3
10 Ohio 19 148 3
11 Ohio 11 159 4
12 Ohio 12 171 4
13 Missouri 11 11 1
14 Missouri 10 21 1
15 Missouri 34 55 2
16 Missouri 19 74 2
17 Missouri 5 79 2
18 Missouri 19 98 2
19 Missouri 19 117 3