R语言处理时序数据:时间区间跨整分钟标记时如何新增拆分行
优化方案
使用dplyr的reframe()函数可以一步完成拆分逻辑,无需创建多个中间数据框,代码简洁且通用性更强:
library(tidyverse) df %>% reframe( speaker = speaker, # 生成时间断点:原起始时间+区间内所有整分钟节点+原结束时间 cuts = sort(unique(c(start, seq(ceiling(start/60000)*60000, end, 60000), end))), # 相邻断点配对作为拆分后的起止时间 start = head(cuts, -1), end = tail(cuts, -1), .by = everything() # 按原行所有字段分组,逐行处理 ) %>% select(speaker, start, end) %>% arrange(start)
运行后输出结果如下:
speaker start end 1 <NA> 0 20000 2 A 20000 35000 3 <NA> 35000 60000 4 <NA> 60000 65000 5 B 65000 80000 6 <NA> 80000 100000 7 C 100000 110000 8 <NA> 110000 120000 9 <NA> 120000 140000 10 C 140000 180000 11 C 180000 195000
方案优势
- 天然支持跨多个整分钟节点的行拆分,比如时间范围从50000到130000的行,会自动拆为50000-60000、60000-120000、120000-130000三行,适用场景更广
- 无冗余中间表,代码结构清晰,维护成本低
- 若dplyr版本低于1.1.0不支持
.by参数,将.by = everything()替换为group_by(across(everything()))即可正常运行
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

