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