在data.table中高效行绑定时间序列并正确排序时间戳的方法
高效合并并排序多列不同的data.table时间序列
好问题!针对你想用data.table高效合并带有部分不同列的大型时间序列,同时希望直接得到按时间戳排序的结果(避免先合并再单独排序的两步操作),这里有几个简洁且高效的方案:
方案1:链式调用合并+排序(一行搞定)
你完全可以把rbind和排序操作链式在一起,不需要创建中间的dt3对象,直接得到最终的排序结果:
library(data.table) tm <- seq(as.POSIXct("2018-05-12 00:00"), as.POSIXct("2018-05-14"), by = "hours") dt <- data.table(time = tm, x = seq(1, length(tm), by = 1)) set.seed(1) dt2 <- data.table(time = tm[sample(length(tm), size = 8)] + rnorm(n = 8, 0, 60), y = rnorm(8)) # 一行完成合并+排序 dt4 <- rbind(dt, dt2, fill = TRUE)[order(time)] tail(dt4, 20)
方案2:用rbindlist替代rbind(更适合多表场景)
如果需要合并3个及以上的data.table,推荐使用rbindlist——它是data.table专门为批量合并设计的函数,效率比rbind.data.table更高,尤其是处理大型数据集时:
# 用rbindlist批量合并并排序 dt4 <- rbindlist(list(dt, dt2), fill = TRUE)[order(time)]
额外优化:为时间列设置索引
如果后续还要频繁按时间戳进行操作,可以在合并排序后给time列设置主键索引,这样后续的查询、分组等操作会更高效:
dt4 <- rbindlist(list(dt, dt2), fill = TRUE)[order(time)] setkey(dt4, time) # 设置主键索引
为什么这两种方案更高效?
- 链式操作避免了存储未排序的中间表,减少了内存占用,对大型数据集来说这一点非常关键;
rbindlist内部做了大量优化,比逐个调用rbind的速度更快,尤其当表的数量较多时;data.table的order()函数是经过底层优化的,排序效率远高于基础R的order()。
内容的提问来源于stack exchange,提问作者user9102888
相关产品推荐
相关产品推荐

