R:cummean()超过子集

时间:2016-06-24 20:52:03

标签: r

我是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:专栏&#34; FTHG&#34;给我们每场比赛的主场目标

2 个答案:

答案 0 :(得分: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()

注意:在滞后声明中添加0(技术上为default=0)会将0代替NA放置为您认为符合要求的初始值。< / p>

以下虚拟数据的结果

数据

    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

答案 1 :(得分:0)

如果输入数据按R然后HomeTeam排序,我认为这会在基础Date中执行:

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
#