求R中日度数据高效聚合为紧凑格式的优化方案
高效合并分组内连续相同值的起止日期(R语言)
原始数据
a = c("a","a","a","a","a","b","b","b","b","b") a = as.data.frame(a) a$date = seq.Date(as.Date("2022-06-01"), as.Date("2022-06-10"), by = 1) a$value = c(8,7,7,7,8,9,9,9,7,8)
期望输出
a = c("a","a","a","b","b","b") a = as.data.frame(a) a$startdate = c("2022-06-01","2022-06-02","2022-06-05","2022-06-06","2022-06-09","2022-06-10") a$enddate = c("2022-06-01","2022-06-04","2022-06-05","2022-06-08","2022-06-09","2022-06-10") a$value = c(8,7,8,9,7,8)
高效解决方案
方法1:使用dplyr包
借助rleid()函数识别连续相同值的分组,再按原始分组和这个连续分组聚合,提取起止日期:
library(dplyr) library(data.table) # 提供rleid函数 result <- a %>% group_by(a, grp = rleid(value)) %>% summarize( startdate = min(date), enddate = max(date), value = first(value) ) %>% ungroup() %>% select(-grp) # 查看结果 print(result)
方法2:使用data.table包(更适合大数据集)
data.table的操作效率更高,尤其处理百万级以上数据时优势明显:
library(data.table) setDT(a) result <- a[, .( startdate = min(date), enddate = max(date), value = first(value) ), by = .(a, grp = rleid(value))][, grp := NULL] # 查看结果 print(result)
两种方法都能避免循环的低效问题,核心是用rleid()给连续相同的value生成唯一分组ID,再按原始分组(a列)和这个连续分组聚合,快速得到每个连续值段的起止日期。
内容的提问来源于stack exchange,提问作者salman anis
相关产品推荐
相关产品推荐

