我正在使用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]
答案 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