如何用R脚本生成依赖前一行的Start与End时间列?
在R中基于Duration列生成连续的Start和End时间列
问题背景
需要基于已有Duration_secs列生成互相依赖的Start和End列,规则如下:
- 第一行
Start固定为0,End = Start + Duration_secs - 后续每行
Start等于上一行的End值,End = 当前Start + Duration_secs
示例数据:
data <- data.frame(Duration_secs = c(26, 300, 300, 300, 300, 300, 300, 300, 247, 300, 300, 300, 300))
解决方案
方法1:Base R(无需额外包)
核心思路:Start列是前n-1个Duration_secs的累计和(第一行为0),End列是Start加当前行Duration_secs,等价于所有Duration_secs的累计和。
# 生成Start列:第一行0,后续为前序Duration的累计和 data$Start <- c(0, cumsum(data$Duration_secs[-nrow(data)])) # 生成End列 data$End <- data$Start + data$Duration_secs
方法2:dplyr(tidyverse风格)
利用cumsum结合lag函数,一行代码生成所需列:
library(dplyr) data <- data %>% mutate( Start = lag(cumsum(Duration_secs), default = 0), # 上一行的累计和,第一行默认0 End = cumsum(Duration_secs) # 直接取累计和作为End )
方法3:data.table(适合大数据量)
如果处理的是大型数据集,data.table的效率更高:
library(data.table) setDT(data)[, `:=`( Start = shift(cumsum(Duration_secs), fill = 0), End = cumsum(Duration_secs) )]
输出结果
运行上述任意代码后,data的结果如下:
Duration_secs Start End 1 26 0 26 2 300 26 326 3 300 326 626 4 300 626 926 5 300 926 1226 6 300 1226 1526 7 300 1526 1826 8 300 1826 2126 9 247 2126 2373 10 300 2373 2673 11 300 2673 2973 12 300 2973 3273 13 300 3273 3573
内容的提问来源于stack exchange,提问作者EmmaV97
相关产品推荐
相关产品推荐

