R - 如何查找上一行的值并在计算中使用?

时间:2014-02-17 16:12:18

标签: r

如果之前有人问过我,我很抱歉,我很难弄清楚如何用我的搜索来找到我正在寻找的东西。我正在寻找一种方法来计算数据框中的列,该列使用先前计算的同一列中的值(计算必须按特定顺序进行)。

我想创建一个列,其中包含每个游戏后每个团队的排名,这是通过使用该游戏之前的团队排名来计算的(如果它是团队的第一个游戏,那么他们之前的排名等于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)))}

1 个答案:

答案 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)