如果之前有人问过我,我很抱歉,我很难弄清楚如何用我的搜索来找到我正在寻找的东西。我正在寻找一种方法来计算数据框中的列,该列使用先前计算的同一列中的值(计算必须按特定顺序进行)。
我想创建一个列,其中包含每个游戏后每个团队的排名,这是通过使用该游戏之前的团队排名来计算的(如果它是团队的第一个游戏,那么他们之前的排名等于0)。 / p>
然后我想要应用于每一行的广义等式是计算排名是:
s = s(n-1) + e^-K*n * z[outcome(n) - {s(n-1) - o_s(n-1)}]
其中K和z是常数,n是游戏数,结果只是该游戏的目标边界(gf-ga),而o_s是对手的力量。
我尝试使用for循环并且只使用sapply函数但是无法获取其中任何一个来检索s(n-1)或o_s(n-1)值。
我可以通过将列g从最小到最大排序数据来在excel中执行此操作,使用索引和匹配函数来查找s(n-1)和o_s(n-1)并将搜索的单元格限制为那些在当前的一行之上。
编辑:
以下是计算出的s列的更好的数据样本:
team g opp og site gf ga adjmov s
Everton 1 Man Utd 1 home 1 0 0.682 0.119
Man City 1 Southampton 1 home 3 2 0.682 0.119
Wigan 1 Chelsea 1 home 0 2 -2.318 -0.403
Newcastle 1 Spurs 1 home 2 1 0.682 0.119
Arsenal 1 Sunderland 1 home 0 0 -0.318 -0.055
Fulham 1 Norwich 1 home 5 0 4.682 0.814
QPR 1 Swansea 1 home 0 5 -5.318 -0.925
Reading 1 Stoke 1 home 1 1 -0.318 -0.055
West Brom 1 Liverpool 1 home 3 0 2.682 0.466
West Ham 1 Aston Villa 1 home 1 0 0.682 0.119
Man Utd 1 Everton 1 away 0 1 -0.682 -0.119
Southampton 1 Man City 1 away 2 3 -0.682 -0.119
Chelsea 1 Wigan 1 away 2 0 2.318 0.403
Spurs 1 Newcastle 1 away 1 2 -0.682 -0.119
Sunderland 1 Arsenal 1 away 0 0 0.318 0.055
Norwich 1 Fulham 1 away 0 5 -4.682 -0.814
Swansea 1 QPR 1 away 5 0 5.318 0.925
Stoke 1 Reading 1 away 1 1 0.318 0.055
Liverpool 1 West Brom 1 away 0 3 -2.682 -0.466
Aston Villa 1 West Ham 1 away 0 1 -0.682 -0.119
Liverpool 2 Man City 2 home 2 2 -0.318 -0.426
Stoke 2 Arsenal 2 home 0 0 -0.318 -0.010
Aston Villa 2 Everton 2 home 1 3 -2.318 -0.433
Man Utd 2 Fulham 2 home 3 2 0.682 0.125
Norwich 2 QPR 2 home 1 1 -0.318 -0.879
Southampton 2 Wigan 2 home 0 2 -2.318 -0.512
Spurs 2 West Brom 2 home 1 1 -0.318 -0.078
Swansea 2 West Ham 2 home 3 0 2.682 1.208
Chelsea 2 Reading 2 home 4 2 1.682 0.588
Everton 2 Aston Villa 2 away 3 1 2.318 0.433
Arsenal 2 Stoke 2 away 0 0 0.318 0.010
Man City 2 Liverpool 2 away 2 2 0.318 0.078
Fulham 2 Man Utd 2 away 2 3 -0.682 0.570
QPR 2 Norwich 2 away 1 1 0.318 -0.860
Wigan 2 Southampton 2 away 2 0 2.318 -0.010
West Brom 2 Spurs 2 away 1 1 0.318 0.426
West Ham 2 Swansea 2 away 0 3 -2.682 -0.165
Reading 2 Chelsea 2 away 2 4 -1.682 -0.240
Sunderland 2 Swansea 3 away 2 2 0.318 0.278
Newcastle 2 Chelsea 3 away 0 2 -1.682 -0.065
Swansea 3 Sunderland 2 home 2 2 -0.318 1.015
Chelsea 3 Newcastle 2 home 2 0 1.682 0.747
hfa是主场优势
hfa <- mean(df$gf[which(df$site == "home")])- mean(df$gf[which(df$site == "away")])
计算adjmov
列的公式是,这些是用于结果计算的值:
df$adjmov <- ifelse(df$site == "home", df$gf - df$ga - hfa, df$fg - df$ga + hfa)
对于我使用的常数的值:
-K <- -0.14
z <- 0.2
我在Excel中用来执行此操作的等式如下所示:
={IFERROR(INDEX(I:I,MATCH(1,(A:A=A2)*(B:B=B2-1),0)),0)+EXP(B2*-0.14)*0.2*(H2-(IFERROR((INDEX(I:I,MATCH(1,(A:A=A2)*(B:B=B2-1),0))),0)-IFERROR((INDEX(I:I,MATCH(1,(A:A=C2)*(B:B=D2-1),0))),0)))}
答案 0 :(得分:1)
应该有一个niceR和更有效的方法来做到这一点,但我只能想出一个(希望是有效的)for循环。
K <- 0.14; z <- 0.2
for(i in seq_len(nrow(mydf))) {
team <- mydf$team[i]
opp <- mydf$opp[i]
n <- mydf$g[i]
o_n <- mydf$og[i]
if(n == 1) s <- 0
else s <- mydf$s2[mydf$team == team & mydf$g == (n - 1)]
if(o_n == 1) o_s <- 0
else o_s <- mydf$s2[mydf$team == opp & mydf$g == (o_n - 1)]
new_s <- s + exp(-K * n) * z * (mydf$adjmov[i] - (s - o_s))
mydf$s2[i] <- round(new_s, 3)
}
mydf
# team g opp og site gf ga adjmov s s2
#1 Everton 1 Man_Utd 1 home 1 0 0.682 0.119 0.119
#2 Man_City 1 Southampton 1 home 3 2 0.682 0.119 0.119
#3 Wigan 1 Chelsea 1 home 0 2 -2.318 -0.403 -0.403
#4 Newcastle 1 Spurs 1 home 2 1 0.682 0.119 0.119
#5 Arsenal 1 Sunderland 1 home 0 0 -0.318 -0.055 -0.055
#6 Fulham 1 Norwich 1 home 5 0 4.682 0.814 0.814
#7 QPR 1 Swansea 1 home 0 5 -5.318 -0.925 -0.925
#8 Reading 1 Stoke 1 home 1 1 -0.318 -0.055 -0.055
#9 West_Brom 1 Liverpool 1 home 3 0 2.682 0.466 0.466
#10 West_Ham 1 Aston_Villa 1 home 1 0 0.682 0.119 0.119
#11 Man_Utd 1 Everton 1 away 0 1 -0.682 -0.119 -0.119
#12 Southampton 1 Man_City 1 away 2 3 -0.682 -0.119 -0.119
#13 Chelsea 1 Wigan 1 away 2 0 2.318 0.403 0.403
#14 Spurs 1 Newcastle 1 away 1 2 -0.682 -0.119 -0.119
#15 Sunderland 1 Arsenal 1 away 0 0 0.318 0.055 0.055
#16 Norwich 1 Fulham 1 away 0 5 -4.682 -0.814 -0.814
#17 Swansea 1 QPR 1 away 5 0 5.318 0.925 0.925
#18 Stoke 1 Reading 1 away 1 1 0.318 0.055 0.055
#19 Liverpool 1 West_Brom 1 away 0 3 -2.682 -0.466 -0.466
#20 Aston_Villa 1 West_Ham 1 away 0 1 -0.682 -0.119 -0.119
#21 Liverpool 2 Man_City 2 home 2 2 -0.318 -0.426 -0.426
#22 Stoke 2 Arsenal 2 home 0 0 -0.318 -0.010 -0.010
#23 Aston_Villa 2 Everton 2 home 1 3 -2.318 -0.433 -0.433
#24 Man_Utd 2 Fulham 2 home 3 2 0.682 0.125 0.125
#25 Norwich 2 QPR 2 home 1 1 -0.318 -0.879 -0.879
#26 Southampton 2 Wigan 2 home 0 2 -2.318 -0.512 -0.512
#27 Spurs 2 West_Brom 2 home 1 1 -0.318 -0.078 -0.079
#28 Swansea 2 West_Ham 2 home 3 0 2.682 1.208 1.209
#29 Chelsea 2 Reading 2 home 4 2 1.682 0.588 0.588
#30 Everton 2 Aston_Villa 2 away 3 1 2.318 0.433 0.433
#31 Arsenal 2 Stoke 2 away 0 0 0.318 0.010 0.010
#32 Man_City 2 Liverpool 2 away 2 2 0.318 0.078 0.079
#33 Fulham 2 Man_Utd 2 away 2 3 -0.682 0.570 0.570
#34 QPR 2 Norwich 2 away 1 1 0.318 -0.860 -0.860
#35 Wigan 2 Southampton 2 away 2 0 2.318 -0.010 -0.010
#36 West_Brom 2 Spurs 2 away 1 1 0.318 0.426 0.426
#37 West_Ham 2 Swansea 2 away 0 3 -2.682 -0.165 -0.165
#38 Reading 2 Chelsea 2 away 2 4 -1.682 -0.240 -0.240
#39 Sunderland 2 Swansea 3 away 2 2 0.318 0.278 0.278
#40 Newcastle 2 Chelsea 3 away 0 2 -1.682 -0.065 -0.064
#41 Swansea 3 Sunderland 2 home 2 2 -0.318 1.015 1.016
#42 Chelsea 3 Newcastle 2 home 2 0 1.682 0.747 0.747
mydf
是:
mydf = read.table(text = '
team g opp og site gf ga adjmov s
Everton 1 Man_Utd 1 home 1 0 0.682 0.119
Man_City 1 Southampton 1 home 3 2 0.682 0.119
Wigan 1 Chelsea 1 home 0 2 -2.318 -0.403
Newcastle 1 Spurs 1 home 2 1 0.682 0.119
Arsenal 1 Sunderland 1 home 0 0 -0.318 -0.055
Fulham 1 Norwich 1 home 5 0 4.682 0.814
QPR 1 Swansea 1 home 0 5 -5.318 -0.925
Reading 1 Stoke 1 home 1 1 -0.318 -0.055
West_Brom 1 Liverpool 1 home 3 0 2.682 0.466
West_Ham 1 Aston_Villa 1 home 1 0 0.682 0.119
Man_Utd 1 Everton 1 away 0 1 -0.682 -0.119
Southampton 1 Man_City 1 away 2 3 -0.682 -0.119
Chelsea 1 Wigan 1 away 2 0 2.318 0.403
Spurs 1 Newcastle 1 away 1 2 -0.682 -0.119
Sunderland 1 Arsenal 1 away 0 0 0.318 0.055
Norwich 1 Fulham 1 away 0 5 -4.682 -0.814
Swansea 1 QPR 1 away 5 0 5.318 0.925
Stoke 1 Reading 1 away 1 1 0.318 0.055
Liverpool 1 West_Brom 1 away 0 3 -2.682 -0.466
Aston_Villa 1 West_Ham 1 away 0 1 -0.682 -0.119
Liverpool 2 Man_City 2 home 2 2 -0.318 -0.426
Stoke 2 Arsenal 2 home 0 0 -0.318 -0.010
Aston_Villa 2 Everton 2 home 1 3 -2.318 -0.433
Man_Utd 2 Fulham 2 home 3 2 0.682 0.125
Norwich 2 QPR 2 home 1 1 -0.318 -0.879
Southampton 2 Wigan 2 home 0 2 -2.318 -0.512
Spurs 2 West_Brom 2 home 1 1 -0.318 -0.078
Swansea 2 West_Ham 2 home 3 0 2.682 1.208
Chelsea 2 Reading 2 home 4 2 1.682 0.588
Everton 2 Aston_Villa 2 away 3 1 2.318 0.433
Arsenal 2 Stoke 2 away 0 0 0.318 0.010
Man_City 2 Liverpool 2 away 2 2 0.318 0.078
Fulham 2 Man_Utd 2 away 2 3 -0.682 0.570
QPR 2 Norwich 2 away 1 1 0.318 -0.860
Wigan 2 Southampton 2 away 2 0 2.318 -0.010
West_Brom 2 Spurs 2 away 1 1 0.318 0.426
West_Ham 2 Swansea 2 away 0 3 -2.682 -0.165
Reading 2 Chelsea 2 away 2 4 -1.682 -0.240
Sunderland 2 Swansea 3 away 2 2 0.318 0.278
Newcastle 2 Chelsea 3 away 0 2 -1.682 -0.065
Swansea 3 Sunderland 2 home 2 2 -0.318 1.015
Chelsea 3 Newcastle 2 home 2 0 1.682 0.747', header = T, stringsAsFactors = F)