【问题标题】:R: cummean() over subsetR: cummean() 在子集上
【发布时间】:2016-06-24 20:52:03
【问题描述】:

我是 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 列中我想做几乎相同的事情,但我不想计算所有主队的进球平均值,我只想计算只有这个特定主队的进球平均值strong>本赛季到目前为止在主场取得了进球(但不包括这场比赛)...

你有什么想法吗?

谢谢!

/E:“FTHG”栏为我们提供每场比赛的主场进球

【问题讨论】:

  • 哪一栏告诉我们主队主场得分?
  • 如果您在HomeTeamAwayTeam 上使用tidyr::gather,那么您就有了一个team 列(以及一个主/客列),您可以group_by 团队。跨度>

标签: r


【解决方案1】:

这是我的解决方案。它使用我假设您已经在使用的 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 作为您的初始值,我相信这是您想要的。

以下虚拟数据的结果

数据

    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

【讨论】:

  • 另外,我忘了提到这种方法假设数据开始按日期排序,如您的示例数据集中。
  • 编辑:添加 ungroup 以将数据框返回到原始状态,受 @EricCachon 启发
  • 是的@Cole,如果您在by_group 之后没有使用summarise,最好添加ungroup
【解决方案2】:

如果输入数据按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
#

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 2013-01-08
    • 2014-06-04
    • 2021-01-06
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多