【发布时间】:2019-08-13 01:17:24
【问题描述】:
我正在使用 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]
【问题讨论】:
-
这只是
dat[, sapply(Date, function(x) sum(x > Date)), by=Group]吗? -
如何将我的用户定义函数插入到这个解决方案中?
-
你没有。我在想这会取代整个功能。
-
我尝试了你的解决方案,但它仍然对每一行都计数。
-
这可以替代您的用户功能吗?
dt[, Sum2 := ifelse(Date > as.IDate("2019-03-20"), (1:.N) - Appt , as.numeric(NA)), by = Group]
标签: r data.table aggregate