将 2 列 data.table 汇总为连续整数
summarising a 2 column data.table to continuous integers
假设一个包含两个整数列 x
和 y
的玩具 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.table
或 dpylr
的解决方案。
创建一个分组列,然后汇总到 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
假设一个包含两个整数列 x
和 y
的玩具 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.table
或 dpylr
的解决方案。
创建一个分组列,然后汇总到 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