我想计算一匹马参加比赛的时间(日期)和完成位置(pos)时马的移动新近加权平均结束位置。这些统计数据在handicapping中很有用。计算R中移动的最近加权平均值
目前,我正在使用“loop-inside-a-loop”方法。对这个问题有没有更快或更优雅的R语言方法?
#
# Test data
#
day <- c(0, 6, 10, 17, 21, 26, 29, 31, 34, 38, 41, 47, 48, 51, 61)
pos <- c(3, 5, 6, 1, 1, 3, 4, 1, 2, 2, 2, 6, 4, 5, 6)
testdata <- data.frame(id = 1, day = day, pos = pos, wt.pos = NA)
#
# No weight is given to observations earlier than cutoff
#
cutoff <- 30
#
# Rolling recency-weighted mean (wt.pos)
#
for(i in 2:nrow(testdata)) {
wt <- numeric(i-1)
for(j in 1:(i-1))
wt[j] <- max(0, cutoff - day[i] + day[j] + 1)
if (sum(wt) > 0)
testdata$wt.pos[i] <- sum(pos[1:j] * wt)/sum(wt)
}
> testdata
id day pos wt.pos
1 1 0 3 NA
2 1 6 5 3.000000
3 1 10 6 4.125000
4 1 17 1 4.931034
5 1 21 1 3.520548
6 1 26 3 2.632911
7 1 29 4 2.652174
8 1 31 1 2.954128
9 1 34 2 2.436975
10 1 38 2 2.226891
11 1 41 2 2.119048
12 1 47 6 2.137615
13 1 48 4 3.030534
14 1 51 5 3.303704
15 1 61 6 4.075000
你混淆了'和'as.numeric' numeric'在你的笔记 – Julius
哦,你是对的,谢谢! – Backlin
当应用于由'testdata'的5000个重复组成的数据帧时,该解决方案比使用循环内部循环方法的解决方案快大约20%。然而,使用mapply和保留外部'for'循环似乎几乎没有任何区别。 – gillenpj