【问题标题】:Conduct rolling sum and then assigning unique group names in R进行滚动求和,然后在 R 中分配唯一的组名
【发布时间】:2017-02-14 03:17:22
【问题描述】:

我需要根据滚动总和为数据集分配唯一的组名。示例DATA 表应该说明我的问题,并查看RESULT 表以获得所需的结果。

DATA 表有两个Rivers,每一行是沿每个River 的一个采样位置。我需要计算Km_inbetween 的滚动总和,当滚动总和超过 50 时,为这些行分配一个组名。然后,重复该过程,从下一行开始滚动总和。

例如,在RESULTS 表中,Ohio River 的前四行总和大于 50,并分配了Group 1。但是,接下来两行的滚动总和超过 50 并分配了Group 2。请注意,GROUP 名称从 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表:

Rivers  Km_inbetween    Group
Ohio         6            1
Ohio         7            1
Ohio         34           1
Ohio         17           1
Ohio         47           2
Ohio         5            2
Ohio         5            3
Ohio         3            3
Ohio         5            3
Ohio         19           3
Ohio         11           3
Ohio         12           3
Missouri     11           1
Missouri     10           1
Missouri     34           1
Missouri     19           2
Missouri     5            2
Missouri     19           2
Missouri     19           2

【问题讨论】:

  • 您能否输入dput 或至少正确格式化您的数据。谢谢!
  • 对@discipulus 感到抱歉.....我很快就发布了这个。请参阅上面的修改。

标签: r dplyr


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2020-05-14
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多