问题描述
我的数据如下:
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