我有一个显示日期、项目和值的数据框,我想添加一列显示其先前 50 个条目的平均值(如果没有 50 个则为 NA),例如该表可能是
data
date item value
01/01/01 a 2
01/01/01 b 1.5
04/01/01 c 1.7
05/01/01 a 1.9
......
它的一部分可能变成
date item value last_50_mean
........
11/09/01 a 1.2 1.1638
12/09/01 b 1.9 1.5843
12/09/01 a 1.4 1.1621
13/09/01 c 0.9 NA
........
因此,在这种情况下,a 在 11/09/01 之前的 50 个条目中的平均值是 1.1638,而 c 在 13/09/01 之前没有 50 个条目,因此返回 NA
我目前正在使用以下功能执行此操作
data[, 'last_50_mean'] <- sapply(1:nrow(data), function(i){
prevDates <- data[data$date < data$date[i] & data$item == data$item[i], ]
num <- nrow(prevGames)
if(nGames >= 50){
round(mean(prevDates[(num- 49):num, ]$value), 4)
}
}
)
但是我的数据框很大,而且需要很长时间(事实上,我不能 100% 确定它是否有效,因为它仍在运行……有谁知道最好的方法吗?