如何根据间隔将一行分成多行

How can I break a row to multiple rows based on interval

我的数据是这样的:

das <- data.frame(val=1:3,
                  beginning =c(10,20,40),
                  end=c(20,40,51))
  val beginning end
1   1        10  20
2   2        20  40
3   3        40  51

我想通过将开头到结尾分成相等的部分来将每一行分成 3 行。像这样

预期输出

> das
  val beginning end
1   1        10  13
2   2        13  16
3   3        16  20
4   4        20  27
5   5        27  34
6   6        34  40
7   7        40  44
8   8        44  48
9   9        48  51

我在这里遇到了类似的问题,但大多数都是 w.r.t 到日期范围。

n_intervals <- 3

rows <- split(das, seq_len(nrow(das)))

res <- do.call(rbind, lapply(rows, function(row) {
  timesplits <- seq(from = row$beginning, 
                    to = row$end, 
                    length.out = n_intervals + 1)
  data.frame(beginning = head(timesplits, -1),
             end = tail(timesplits, -1))
}))

res$val <- seq_len(nrow(res))

#>     beginning      end val
#> 1.1  10.00000 13.33333   1
#> 1.2  13.33333 16.66667   2
#> 1.3  16.66667 20.00000   3
#> 2.1  20.00000 26.66667   4
#> 2.2  26.66667 33.33333   5
#> 2.3  33.33333 40.00000   6
#> 3.1  40.00000 43.66667   7
#> 3.2  43.66667 47.33333   8
#> 3.3  47.33333 51.00000   9

可以在tidyr中使用uncount(),然后计算每个val的增量。

library(dplyr)
library(tidyr)

das %>%
  uncount(3) %>% 
  mutate(beginning = beginning + round((end - beginning)/3) * 0:2,
         end = lead(beginning, default = last(end)))

#   val beginning end
# 1   1        10  13
# 2   1        13  16
# 3   1        16  20
# 4   2        20  27
# 5   2        27  34
# 6   2        34  40
# 7   3        40  44
# 8   3        44  48
# 9   3        48  51