进行滚动总和,然后在R

时间:2017-02-14 03:17:23

标签: r dplyr

我需要根据滚动总和为数据集分配唯一的组名。示例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

1 个答案:

答案 0 :(得分:1)

我认为这种方法接近你想要的。

它使用dplyrgroup_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