【问题标题】:Conditionally Rollmean based on another column value基于另一列值的有条件 Rollmean
【发布时间】:2021-06-11 14:14:15
【问题描述】:

我正在尝试根据球员过去 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)) 

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

【问题讨论】:

    标签: r dplyr zoo rollapply


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-17
      • 2020-11-17
      • 2015-08-19
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 2019-08-15
      相关资源
      最近更新 更多