You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:41:36