R: 在一个子集上使用cummean()函数

5

我是 R 语言和 stackoverflow 的新手,请见谅如果我在这里做错了什么...

我正在处理足球数据,数据看起来像这样:

  Div     Date      HomeTeam   AwayTeam FTHG FTAG avgHG_league avgHG_team
1  D1 14/08/15 Bayern Munich    Hamburg    5    0           NA          0
2  D1 15/08/15      Augsburg     Hertha    0    1     5.000000          0
3  D1 15/08/15     Darmstadt   Hannover    2    2     2.500000          0
4  D1 15/08/15      Dortmund M'gladbach    4    0     2.333333          0
5  D1 15/08/15    Leverkusen Hoffenheim    2    1     2.750000          0
6  D1 15/08/15         Mainz Ingolstadt    0    1     2.600000          0

我已创建 avgHG_league 列,以便为我提供本赛季主队平均进球数,使用以下代码:
BLfiltered <- BLfiltered %>%
  mutate(avgHG_league = lag(cummean(FTHG),1))

现在在avgHG_team列中,我想做的基本上与此类似,但是不是计算所有主队得分平均值,而是只计算本赛季以来仅有该特定主队在主场迄今为止已经得到的平均进球数(但不包括本场比赛)...你有什么想法吗?
谢谢!
/E:列“ FTHG”给出了每场比赛的主场进球数。

哪一列告诉我们主队在主场的得分? - Ankita
如果你在 HomeTeamAwayTeam 上使用 tidyr::gather,那么你就会得到一个 team 列(和一个主场/客场列),然后你可以按照 team 进行分组。 - alistaire
2个回答

2

这是我的解决方案。它使用了dplyr软件包,我假设您已经在使用中,因为您在示例中调用了cummean。为简单起见,我将数据称为sd,表示足球数据。

sd = mutate(sd,avgHG_league=lag(cummean(FTHG),1,0)) %.% group_by(HomeTeam) %.% mutate(avgHG_Team=lag(cummean(FTHG),1,0)) %.% ungroup()

注意:在lag语句中添加“0”(实际上是“default=0”)可以将值“0”放置在初始值而非“NA”的位置,我相信这正是您想要的。
以下是以下虚拟数据的结果。

数据

    Div     Date      HomeTeam   AwayTeam FTHG FTAG
1   D1 14/08/15 Bayern Munich    Hamburg    5    0
2   D1 15/08/15      Augsburg     Hertha    0    1
3   D1 15/08/15     Darmstadt   Hannover    2    2
4   D1 15/08/15      Dortmund M'gladbach    4    0
5   D1 15/08/15    Leverkusen Hoffenheim    2    1
6   D1 15/08/15         Mainz Ingolstadt    0    1
7   D1 15/09/15 Bayern Munich    Hamburg    0    0
8   D1 15/10/15      Augsburg     Hertha    0    0
9   D1 15/10/15     Darmstadt   Hannover    0    0
10  D1 15/10/15      Dortmund M'gladbach    0    0
11  D1 15/10/15    Leverkusen Hoffenheim    0    0
12  D1 15/10/15         Mainz Ingolstadt    0    0
13  D1 15/11/15 Bayern Munich    Hamburg    0    0
14  D1 15/10/16      Augsburg     Hertha    0    0
15  D1 15/11/16     Darmstadt   Hannover    0    0
16  D1 15/10/17      Dortmund M'gladbach    0    0
17  D1 15/11/17    Leverkusen Hoffenheim    0    0
18  D1 15/10/18         Mainz Ingolstadt    0    0

结果

    Div   Date        HomeTeam   AwayTeam FTHG FTAG avgHG_league avgHG_Team
1   D1 14/08/15 Bayern Munich    Hamburg    5    0    0.0000000        0.0
2   D1 15/08/15      Augsburg     Hertha    0    1    5.0000000        0.0
3   D1 15/08/15     Darmstadt   Hannover    2    2    2.5000000        0.0
4   D1 15/08/15      Dortmund M'gladbach    4    0    2.3333333        0.0
5   D1 15/08/15    Leverkusen Hoffenheim    2    1    2.7500000        0.0
6   D1 15/08/15         Mainz Ingolstadt    0    1    2.6000000        0.0
7   D1 15/09/15 Bayern Munich    Hamburg    0    0    2.1666667        5.0
8   D1 15/10/15      Augsburg     Hertha    0    0    1.8571429        0.0
9   D1 15/10/15     Darmstadt   Hannover    0    0    1.6250000        2.0
10  D1 15/10/15      Dortmund M'gladbach    0    0    1.4444444        4.0
11  D1 15/10/15    Leverkusen Hoffenheim    0    0    1.3000000        2.0
12  D1 15/10/15         Mainz Ingolstadt    0    0    1.1818182        0.0
13  D1 15/11/15 Bayern Munich    Hamburg    0    0    1.0833333        2.5
14  D1 15/10/16      Augsburg     Hertha    0    0    1.0000000        0.0
15  D1 15/11/16     Darmstadt   Hannover    0    0    0.9285714        1.0
16  D1 15/10/17      Dortmund M'gladbach    0    0    0.8666667        2.0
17  D1 15/11/17    Leverkusen Hoffenheim    0    0    0.8125000        1.0
18  D1 15/10/18         Mainz Ingolstadt    0    0    0.7647059        0.0

来源

这里可以看到类似的数据处理方法:https://blog.rstudio.org/2014/01/17/introducing-dplyr/

这也是使用tidyr和dplyr进行R语言数据操作的绝佳资源:https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf


另外,我忘了提到这种方法假设数据按日期排序,就像你的示例数据集一样。 - Cole
编辑:受 @EricCachon 启发,添加了 ungroup 以将数据框恢复到原始状态。请返回翻译后的文本: - Cole
1
是的,@Cole,如果您在“by_group”后没有使用“summarise”,那么添加“ungroup”是一个好主意。 - Erick Chacon

0

我认为只要输入数据按HomeTeamDate排序,这个在基础的R中就可以实现:

my.data <- read.csv(text = '
  Div,     Date,      HomeTeam,   AwayTeam, FTHG, FTAG
   D1, 14/08/15, Bayern Munich,    Hamburg,    5,    0
   D1, 15/08/15, Bayern Munich,     Hertha,    0,    1
   D1, 16/08/15,     Darmstadt,   Hannover,    2,    2
   D1, 17/08/15,     Darmstadt, Ingolstadt,    4,    0
   D1, 18/08/15,     Darmstadt, Hoffenheim,    2,    1
   D1, 19/08/15,         Mainz, Ingolstadt,    0,    1
', header = TRUE, stringsAsFactors = FALSE, strip.white = TRUE)

my.data <- my.data[with(my.data, order(HomeTeam, Date)), ]
my.data

my.means <- aggregate(my.data$FTHG, by=list(my.data$HomeTeam), 
            FUN = {function(x) cumsum(x)/seq(from=1, to=length(x)) })

my.data$my.cum.means <- c(unlist(my.means[2]))
my.data

#
#     Div     Date      HomeTeam   AwayTeam FTHG FTAG my.cum.means
#x.11  D1 14/08/15 Bayern Munich    Hamburg    5    0     5.000000
#x.12  D1 15/08/15 Bayern Munich     Hertha    0    1     2.500000
#x.21  D1 16/08/15     Darmstadt   Hannover    2    2     2.000000
#x.22  D1 17/08/15     Darmstadt Ingolstadt    4    0     3.000000
#x.23  D1 18/08/15     Darmstadt Hoffenheim    2    1     2.666667
#x.3   D1 19/08/15         Mainz Ingolstadt    0    1     0.000000
#

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接