我是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;给我们每场比赛的主场目标
答案 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
#