将 2 列 data.table 汇总为连续整数

summarising a 2 column data.table to continuous integers

假设一个包含两个整数列 xy 的玩具 data.table。 x 列可以包含任何整数,但 y 列的值将大一(下一个连续整数)。

data.table::data.table(
           x = c(1L, 3L, 7L, 8L, 11L, 12L, 13L, 15L),
           y = c(2L, 4L, 8L, 9L, 12L, 13L, 14L, 16L)
)
#>     x  y
#> 1:  1  2
#> 2:  3  4
#> 3:  7  8
#> 4:  8  9
#> 5: 11 12
#> 6: 12 13
#> 7: 13 14
#> 8: 15 16

我想折叠具有连续 运行 整数范围(行之间共有一个数字)的行,以便在新的 data.table 中 x 具有最小值并且 y 范围的最大值。唯一的条件是整数范围 (x:y) 将包括被替换的原始行中存在的所有数字。

这是所需的输出:

data.table::data.table(
           x = c(1L, 3L, 7L, 11L, 15L),
           y = c(2L, 4L, 9L,  14L, 16L)
)
#>     x  y
#> 1:  1  2
#> 2:  3  4
#> 3:  7  9
#> 4: 11 14
#> 5: 15 16

reprex package (v2.0.1)

于 2022-04-28 创建

这是一个如此简单的要求,但我无法解决它。可能有很多方法可以解决这个问题,但我正在寻找一种优雅的方法。

我愿意接受任何使用 data.tabledpylr 的解决方案。

创建一个分组列,然后汇总到 return 'x' 列的 first 和 'y' 列的 last - 分组是通过检查创建的'y'的lag值是否不等于'x'的当前值,求和

library(data.table)
dt[, .(x = first(x), y = last(y)), .(grp = cumsum(shift(y, 
     fill = first(y)) != x))][, grp := NULL][]

-输出

      x     y
   <int> <int>
1:     1     2
2:     3     4
3:     7     9
4:    11    14
5:    15    16