R 由两列分开的移动平均线分组

R 由两列分开的移动平均线分组,r,R,我有一个数据框,包含客队和主队的得分 DF = data.frame(Away = c("A","B","C","B","A","C"), Home = c("B","C","A","A","C","B"), AwayPts

我有一个数据框,包含客队和主队的得分

DF = data.frame(Away = c("A","B","C","B","A","C"), Home = c("B","C","A","A","C","B"), 
                AwayPts = c(10,22,12,14,25,10), HomePts = c(11,14,13,15,15,13))

Away Home AwayPts HomePts
A    B    10      11
B    C    22      14
C    A    12      13
B    A    14      15
A    C    25      15
C    B    10      13
我试图找出每支球队的落后(k=1)滚动平均分,不管他们是客场还是主队。我希望像这样添加两列

Away Home AwayPts HomePts AwayMA HomeMA
A    B    10      11      NA     NA
B    C    22      14      NA     NA
C    A    12      13      NA     NA
B    A    14      15      16.5   11.5   # (16.5=(22+11)/2) (11.5=(13+10)/2)
A    C    25      15      14     13
C    B    10      13      13.5   18
到目前为止,我必须创建“AwayMA”列的代码如下……但我想以某种方式将HomePts添加到rollappyr函数中

library(dplyr)
library(zoo)

DF = DF %>% group_by(Away, Home) %>% mutate(AwayMA = lag(rollapplyr(AwayPts, 2, mean, fill = NA),k=1))

可以使用基本R函数解决此问题,如下所示:

d <- reshape(DF, matrix(1:4, 2, byrow = TRUE), dir="long")
e <- d[order(d$Away,d$id),]
e$AwayPts= unlist(tapply(e$AwayPts, e$Away,filter, filter=c(0,1,1)/2, sides=1))
e <- e[order(e$time, e$id),]
attributes(e) <- attributes(d)
cbind(DF, reshape(e)[c("AwayPts", "HomePts")])

    Away Home AwayPts HomePts AwayPts HomePts
1.1    A    B      10      11      NA      NA
2.1    B    C      22      14      NA      NA
3.1    C    A      12      13      NA      NA
4.1    B    A      14      15    16.5    11.5
5.1    A    C      25      15    14.0    13.0
6.1    C    B      10      13    13.5    18.0

<代码> d> p>您也可以考虑以下内容。将使用
pivot\u longer
以长格式输入,这将更容易通过仅按“团队”分组来计算滚动平均值。如果重命名“客场”和“主场”列,则更容易合并团队(因为积分列都以“Pts”结尾,所以它们已经设置好了)。计算滚动平均值后,您可以使用
pivot\u wider
将其放回宽格式。
Game
列有助于将其作为一个id列重新转换为广泛形式

编辑:感谢G.Grothendieck简化滚动平均值。对宽度使用
list(-(1:2))
将包括-1和-2的偏移量,从而消除
滞后的需要

library(tidyverse)
library(zoo)

DF %>%
  rename_at(vars(Away, Home), ~ str_c(., "Team")) %>%
  mutate(Game = row_number()) %>%
  pivot_longer(cols = -Game, 
               names_to = c("Location", ".value"), 
               names_pattern = "(\\w+)(Team|Pts)") %>%
  group_by(Team) %>%
  mutate(MA = rollapply(Pts, list(-(1:2)), mean, fill = NA)) %>%
  pivot_wider(id_cols = Game, names_from = Location, values_from = c(Team, Pts, MA))
输出

   Game Team_Away Team_Home Pts_Away Pts_Home MA_Away MA_Home
  <int> <chr>     <chr>        <dbl>    <dbl>   <dbl>   <dbl>
1     1 A         B               10       11    NA      NA  
2     2 B         C               22       14    NA      NA  
3     3 C         A               12       13    NA      NA  
4     4 B         A               14       15    16.5    11.5
5     5 A         C               25       15    14      13  
6     6 C         B               10       13    13.5    18  
游戏团队\客场团队\主场球员\客场球员\主场球员\客场球员\客场球员\主场球员\客场球员\主场球员
1 A B 10 11 NA NA
2 2 B C 22 14 NA NA
3 3 C A 12 13 NA NA
4 4 B 14 15 16.5 11.5
5 A C 25 15 14 13
6 C B 10 13 13.5 18