次のコマンドで生成されたデータ フレームがあるとします。
date <- seq(as.Date("2012-09-01"), Sys.Date(), 1)
id <- rep(c("a","b","c","d"), 8)
bdate <- seq(as.Date("2012-08-01"), as.Date("2012-11-01"), 1)[sample(1:32, 32)]
# The end date should be random but greater than the begin date. However, I set it to 15 days later for simplicity.
edate <- bdate + 15
value <- seq(1, 1000, 1)[sample(1:1000, 32)]
dfa <- data.frame(id, value, bdate, edate)
names(dfa) <- c("ID", "Value", "Begin.Date", "End.Date")
目標は、次の方法で ID (つまり、「a」、「b」、または「c」) ごとにすべての観測値を合計することです。
Date a b c
2012-08-01 XXX YYY ZZZ
2012-08-02 XXX YYY ZZZ
2012-08-03 XXX YYY ZZZ
値 XXX、YYY、および ZZZ は、ID ごとに、列 "Date" の日付が元のデータ フレームの dfa$Begin.Date と dfa$End.Date の間にあるすべての観測値の合計を表します。
私の現在のソリューションは、大規模なデータセットには実質的に役に立たないので、より高速な方法があるかどうか疑問に思っていました.
私の現在のスクリプト:
# Create additional data frame
dfb <- data.frame(seq(as.Date("2012-08-01"), as.Date("2012-11-01"), 1))
names(dfb)[1] <- "Date"
# Variable for unique IDs
nid <- unique(dfa$ID)
# Number of total IDs
tid <- length(nid)
for (i in c(1:tid))
{
sums <- vapply(dfb$Date, function(x)
{
temp <- subset(dfa, dfa$ID == nid[i])
temp <- subset(temp, temp$Begin.Date < x & temp$End.Date > x)
res <- sum(temp$Value)
res
}, FUN.VALUE = 0.1
)
dfb[1+i] <- sums
}
# Change column names to ID
names(dfb) <- c("Date", as.character(nid))
編集:これを行うためのより効率的な方法で、以下の回答を投稿しました。ただし、マシューの答えは正しい道を示してくれたので、受け入れました。