【问题标题】:R: group dates that are next to each otherR:将彼此相邻的日期分组
【发布时间】:2020-05-27 01:18:01
【问题描述】:

我有一系列不规则的日期(年)。

具体来说,2004 年之后是 2005 年,缺少 2006 年,存在 2007 年,然后是 2008 年,然后序列缺少直到 2014 年的年份。

# data input
df_in <- 
  data.frame(seq = c(2004L, 2005L, 2007L, 2008L, 2014L, 2015L, 2016L))

# desired result
df_out <- 
  data.frame(df_in, grp = c(1L, 1L, 2L, 2L, 3L, 3L, 3L))

   seq grp
1 2004   1
2 2005   1
3 2007   2
4 2008   2
5 2014   3
6 2015   3
7 2016   3

我想找到一种方法来生成彼此相邻的年份组。因此,第 1 组将包含 2004 年和 2005 年,第 2 组从 2007 年和 2008 年,第 3 组从 2014 年到 2016 年。

任何帮助将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:
    cumsum(c(1, diff(df_in$seq)) != 1) + 1
    [1] 1 1 2 2 3 3 3
    

    【讨论】:

      【解决方案2】:

      怎么样:

      df_in$group = 1 + c(0, cumsum(ifelse(diff(df_in$seq) > 1, 1, 0)))
      

      这里的想法是diff 计算滞后差。当它大于 1 时,我们将其添加到组中。 cumsum 计算我们遇到差距的那些时间的累积总和,也就是一个新组。 c(0, 存在是因为 diff 的输出比我们的数据短一个,我们需要第一个元素的值。最后,1 + 仅用于光学,因此第一组是 1 而不是 0。

      > df_in$group 
      [1] 1 1 2 2 3 3 3
      

      【讨论】:

        【解决方案3】:

        这是我能想到的最好的。但如果其他人有更优雅的解决方案,我会很棒:

        df_in <- data.frame(seq = c(2004L, 2005L, 2007L, 2008L, 2014L, 2015L, 2016L))
        

        定义一个组元素之间的最大距离:

        max_range_within_group <- 1
        

        计算现有距离:

        diffs <- df_in$seq[-1] - df_in$seq[-length(df_in$seq)]
        

        迭代槽距离并检查它们是否在“允许”距离内或将 grp 增加 1:

        grp <- 1
        for (diff in diffs) {
          nextGrp <- if (diff <= max_range_within_group) {
            grp[length(grp)]
          } else {
            grp[length(grp)] + 1
          }
          grp <- c(grp, nextGrp)
        }
        

        grp绑定到data.frame:

        df_in$grp <- grp
        

        这会返回:

           seq grp
        1 2004   1
        2 2005   1
        3 2007   2
        4 2008   2
        5 2014   3
        6 2015   3
        7 2016   3
        

        【讨论】:

          猜你喜欢
          • 2014-03-18
          • 2016-03-20
          • 2017-05-13
          • 1970-01-01
          • 1970-01-01
          • 2016-12-30
          • 2013-04-22
          • 2023-04-06
          • 1970-01-01
          相关资源
          最近更新 更多