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

问题描述

我的数据如下:

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

在这里遇到了类似的问题,但大多数都是迄今为止的问题。

解决方法

您可以在uncount()中使用tidyr,然后计算每个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
,
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