【发布时间】:2016-03-13 02:13:46
【问题描述】:
我有一个包含许多列的 R data.frame,其中一个包含 POSIXct 时间戳记录。我想向 data.frame 添加一列,对于每一行,该列包含时间戳介于该行的时间戳和未来一秒之间的记录数。
以下代码实现了这一点,但我正在处理的数据(通常是 60K+ 记录)确实很慢。我想知道是否有办法加快速度。
# Create a data frame with POSIXct values spread over a few minutes.
# The actual number of records can be over 60,000.
set.seed(1234)
times <- as.POSIXct("2015-02-18 11:39:17.104206 AEDT") +
runif(n = 10000, min = -5*60, max = 5*60)
times <- sort(times) # my source data comes to me sorted
times <- data.frame(datetime = times)
# For each event (timestamp), calculate how many events (timestamps) appear in
# a one second window following that event.
system.time(
for (i in 1:length(times$datetime)) {
times$eventCount[i] <- sum(
times$datetime >= times$datetime[i] &
times$datetime < times$datetime[i] + 1)
}
)
我系统上的结果是:
user system elapsed
8.10 0.00 8.21
有趣的是,处理时间并不会随着记录的数量呈线性变化。对于 20K 条记录,用户时间为 24.74 秒。
查看类似的问题(例如 this 和其中引用的问题)会建议使用 data.table 可以大大加快速度,但我无法弥合这些答案中代码之间的差距(看起来在给定记录的任一侧固定数量的记录)到我需要的(查看给定记录一侧的未知数量的记录)。
rcpp 看起来会是最好的方法,但我根本不懂任何 c++。
任何帮助表示赞赏!
【问题讨论】:
-
我想知道是否进行二分搜索,将间隔减半直到 1 秒窗口内的最大项目会更好?
-
我添加了反映@BondedDust 建议的Rcpp 实现。速度很快。
-
强大的工作@Khashaa。自从我对您的第一次努力投了赞成票以来,我无法再添加任何赞成票。你有我的尊重。
-
谢谢你,@BondedDust。我受宠若惊。
标签: r optimization dataframe data.table self-reference