このコードは、私自身と同様のデータセットを生成します。
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 パッケージを使用することは非常にうまくいきましたが、ここでそれを機能させる方法がわかりません。たぶん、data.tableの中でlapplyですか?
前もって感謝します!