【发布时间】:2012-05-23 13:39:41
【问题描述】:
这段代码生成了一个类似于我自己的数据集:
df <- c(seq(as.Date("2012-01-01"), as.Date("2012-01-10"), "days"))
df <- as.data.frame(df)
df <- rbind(df, df)
id <- c(rep.int(1, 10), rep.int(2, 10))
id <- as.data.frame(id)
cnt <- c(1:3, 0, 0, 4, 5:8, 0, 1, 0, 1:7)
cnt <- as.data.frame(cnt)
df <- cbind(id, df, cnt)
names(df) <- c("id", "date", "cnt")
df$date[df$date == "2012-01-10"] <- "2012-01-20"
我正在尝试查找过去 7 天内发生的变量“cnt”的总和。有时日期不是连续的(参见前面的“df”中的最后一个日期)——按 id。
这是循环:
system.time(
for(i in 1:length(df$date)) {
df$cnt.weekly[i] <-
sum(df$cnt[which((df$date == df$date[i] - 1) & df$id == df$id[i])],
df$cnt[which((df$date == df$date[i] - 2) & df$id == df$id[i])],
df$cnt[which((df$date == df$date[i] - 3) & df$id == df$id[i])],
df$cnt[which((df$date == df$date[i] - 4) & df$id == df$id[i])],
df$cnt[which((df$date == df$date[i] - 5) & df$id == df$id[i])],
df$cnt[which((df$date == df$date[i] - 6) & df$id == df$id[i])])})
我最终在 800 万行 data.frame(数千个 id)上运行它,所以虽然玩具在这里很快,但在实践中却非常慢。
我在代码的其他部分使用 data.table 包非常幸运,但我不知道如何让它在这里工作。也许 lapply 在 data.table 内?
提前致谢!
【问题讨论】:
-
试试
rollapply?此外,存储您的df$id==df$id[i]比较,这样就不会每次都重新计算。此外,如果i-6在一周之内,那么i-5、i-4等也是如此。另见:stackoverflow.com/questions/2908822/… -
谢谢你,很好的建议。
标签: r data.table lapply