基于另一个列值的有条件 Rollmean

Conditionally Rollmean based on another column value

我正在尝试根据球员在过去 3 场比赛中对阵同一个手投手的表现,计算他们的幻想得分的移动平均值。

FP <- data.frame(player = c(rep("A",10), rep("B",10), rep("C",10)),
                pitcher_hand = rep(c("R","L"),15), 
                fantasy_points = runif(30, min = 0, max = 25))

我知道我可以使用 (zoo) 中的 rollapplyr 来获取移动平均线,但在这里我需要基于另一列的条件移动平均线。例如,第 7 行的新列移动平均值将是第 5、3 和 1 行的平均幻想点数,因为它针对的是同一个投手。我试过:

FP <- FP %>%
 group_by(player) %>%
 mutate(FP_L3 = rollapplyr(.,list(-(3:1)),function(x) mean(x[x[['pitcher_hand']]==pitcher_hand]),fill=NA)) 

如何做到这一点?我可以在一个大循环中执行此操作,遍历我的数据框中的每一行并搜索正确的匹配项,但是我想避免这种情况,因为我的数据框非常大。

group_by-

中包含pitcher_hand
library(dplyr)

FP %>%
  group_by(player, pitcher_hand) %>%
  mutate(FP_L3 = lag(rollmeanr(fantasy_points, 3, fill = NA))) %>%
  ungroup

#  player pitcher_hand fantasy_points FP_L3
#   <chr>  <chr>                 <dbl> <dbl>
# 1 A      R                     12.7   NA  
# 2 A      L                      6.48  NA  
# 3 A      R                     10.7   NA  
# 4 A      L                     18.1   NA  
# 5 A      R                     16.3   NA  
# 6 A      L                      7.92  NA  
# 7 A      R                      5.62  13.2
# 8 A      L                     22.5   10.8
# 9 A      R                     14.8   10.9
#10 A      L                      5.32  16.2
# … with 20 more rows