我有一个包含赛马数据的数据集。如果缺少 avgl6rank 值,我编写了一个函数来计算每行马匹在比赛日期的平均最近 6 个排名。该函数运行速度非常慢,所以我想通过使用 data.table 来加快速度。但是我遇到了麻烦,如何在每行的日期之前使用 rdate 为每行创建组,并按 Horsenum 分组。我在哪里可以插入日期过滤
jc.data[is.na(avgl6rank), avgl6rank:= round(mean(tail(rank, 6),na.rm = T)), by = horsenum]
Run Code Online (Sandbox Code Playgroud)
预期输出与输入数据框相同,如果我们可以在该行的日期之前找到这匹马的最近 6 次或更少的比赛记录,只需在 avgl6rank 列中填写缺失值,并计算平均排名。
Avg6RankF <- function(df){
if (!is.na(df["avgl6rank"])) {
return(df["avgl6rank"])
} else {
tmp <- subset(jc.data, horsenum == df["horsenum"] & rdate < df["rdate"])
if (nrow(tmp) > 0) {
return(round(mean(tail(tmp$rank, 6),na.rm = TRUE)))
} else {
return(NA)
}
}
}
jc.data['avgl6rank'] <- apply(jc.data, 1, Avg6RankF)
Run Code Online (Sandbox Code Playgroud)
structure(list(index = c(64L, 577L, 33704L, 34538L, 35753L, 36119L,
36641L, 38259L, 38484L, 39060L, 40507L, 41326L, …Run Code Online (Sandbox Code Playgroud)