如何解决基于另一个列值有条件地 Rollmean
我试图根据玩家过去 3 场比赛对同一手投手的表现,计算他们的幻想点数的移动平均值。
FP <- data.frame(player = c(rep("A",10),rep("B",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))
这是怎么做到的?我可以在一个大循环中执行此操作,遍历数据帧中的每一行并搜索正确的匹配项,但是我想避免这种情况,因为我的数据帧非常大。
解决方法
在 pitcher_hand
中包含 group_by
-
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。