R data.table使用完整数据集对选定的行执行汇总

时间:2019-03-22 04:46:29

标签: r data.table aggregate

我正在使用data.table为R中的机器学习算法计算功能。我将仅对具有未来日期的行进行预测,但是要计算每个功能,我需要对可以包含数百万行的大型数据集进行汇总。但是,为了提高处理速度和性能,我不需要汇总即可计算过去日期的行。

简而言之,我正在尝试使用一个大型数据集来使用整个数据集仅计算最后 n 行的特征,并跳过日期在过去的行。我有一个用户定义的函数,该函数计算比循环中正在计算的当前行高的行数。我下面的示例data.table显示了我正在尝试实现的结果。正在计算的行将计算比其高的行数,然后移至循环中的下一行。我希望它跳过具有过去日期的所有行,而仅计算具有未来日期的行。在此示例中,当前日期为2019-03-20

Group         Date  Appt  Sum
    A   2019-03-18     1   NA
    A   2019-03-19     1   NA
    A   2019-03-20     1   NA
    A   2019-03-21     1    3
    A   2019-03-22     1    4
    A   2019-03-23     1    5

library(data.table)
dt = structure(list(Group = c("A", "A", "A", "A", "A", "A"), Date = structure(c(17973, 
17974, 17975, 17976, 17977, 17978), class = "Date"), Appt = c(1L, 
1L, 1L, 1L, 1L, 1L), Sum = c(NA, NA, NA, 3, 4, 5)), row.names = c(NA, 
-6L), class = "data.frame")
setDT(dt)

这是我当前正在使用的功能和代码,它可以完美运行。唯一的问题是,即使我只需要数据集末尾几行的计算结果(可能数以百万计),它也会对每一行执行计算。通过进行将要排除在预测集中之外的计算,浪费了大量的处理能力和时间。

rollingSum <- function(i, data, count, dates) {
  z <- with(data[i, ], zoo(count, dates))
  g <- zoo(, seq(start(z), end(z), by="day"))
  m <- merge(z, g)
  window(rollapplyr(m, 365, sum, na.rm=TRUE, partial=TRUE), time(z))
}

dt[, Sum := as.numeric(rollingSum(data=dt, count=Appt, dates=Date) - Appt), by=Group]

1 个答案:

答案 0 :(得分:1)

以下是我的评论的更多详细信息:

dt <- data.table(
  Group = "A",
  Date = as.IDate(c("2019-03-18", "2019-03-19", "2019-03-20",
                    "2019-03-21", "2019-03-22","2019-03-23")),
  Appt = 1)


microbenchmark(
  dt[, Sum := as.numeric(rollingSum(data=dt, count=Appt, dates=Date) - Appt), by=Group],
  dt[, Sum2 := ifelse(Date > as.IDate("2019-03-20"), (1:.N) - Appt , as.numeric(NA)), by = Group],unit = "ms")

这是基准:

Unit: milliseconds
       expr      min        lq      mean   median       uq         max neval
 rollingSum 3.463955 4.0644910 18.748804 4.353562 4.745325 1395.840823   100
   new func 0.768079 0.8757095  1.258782 1.015766 1.140316    8.275985   100