【问题标题】:Summarizing groups where the intervals are adjacent汇总区间相邻的组
【发布时间】:2020-08-24 04:23:31
【问题描述】:

我有一个数据框,其中包含带有两个分组变量(ID 和 Grouping)的区间数据(From 和 To)。我试图将数据汇总到具有相同 ID 和分组的组中,并且间隔相邻。

下面是一个示例数据框。我知道可以使用 dplyr 中的 group_by 函数对数据进行分组,并且可以使用 dplyr 中的 summarise 函数进行汇总(在此示例中使用每个组的总和进行汇总),但不确定如何确保 dplyr 仅加入间隔相邻的组.

ID <- c('ID1','ID1','ID1','ID1','ID1','ID1','ID2','ID2','ID2','ID2')
grouping <- c(1,1,1,1,1,1,1,1,1,1)
From <- c(1,5,6,20,40,41,45,52,60,61)
To <- c(5,6,10,25,41,45,52,53,61,62) 
Value <- c(1,2,1,2,2,3,1,1,1,4)
df <- data.frame(ID, grouping, From, To, Value)

    ID grouping From To Value
1  ID1        1    1  5     1
2  ID1        1    5  6     2
3  ID1        1    6 10     1
4  ID1        1   20 25     2
5  ID1        1   40 41     2
6  ID1        1   41 45     3
7  ID2        1   45 52     1
8  ID2        1   52 53     1
9  ID2        1   60 61     1
10 ID2        1   61 62     4

下面是想要的结果

   ID grouping From To Value
1 ID1        1    1 10     4
2 ID1        1   20 25     2
3 ID1        1   40 45     5
4 ID2        1   45 53     2
5 ID2        1   60 62     5

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    使用From != lag(To)cumsum 生成每个区间并汇总数据。

    library(dplyr)
    
    df %>%
      group_by(ID, grouping, interval = cumsum(From != lag(To, default = From[1]))) %>%
      summarise(From = min(From), To = max(To), Value = sum(Value)) %>%
      ungroup %>%
      select(-interval)
    
    # # A tibble: 5 x 5
    #   ID    grouping  From    To Value
    #   <fct>    <dbl> <dbl> <dbl> <dbl>
    # 1 ID1          1     1    10     4
    # 2 ID1          1    20    25     2
    # 3 ID1          1    40    45     5
    # 4 ID2          1    45    53     2
    # 5 ID2          1    60    62     5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 2013-09-13
      • 2023-03-04
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多