如果之前有人問過我,我很抱歉,我很難弄清楚如何將我的搜索字詞發現以找到我要找的內容。我正在尋找一種方法來計算數據框中的一列,該數據框使用先前計算的同一列中的值(計算必須按特定順序完成)。R - 如何查找前一行的值並在計算中使用?
我想創建一個包含每個團隊在每場比賽之後排名的列,該列是使用該團隊在該遊戲之前的排名(如果是團隊的第一個遊戲,那麼他們以前的排名等於0)計算出來的列。
然後推廣形式我想申請到每一行是計算的排名是:
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)值。
我可以在excel中做到這一點,通過按列g從最小到最大排序數據,使用索引和匹配函數來查找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)))}
這是R A棘手的問題 - 你認爲你的數據重塑到大幅面有每隊一行,該行中所有的遊戲數據?然後,您可以計算一組排名變量(每場比賽後一個),然後重塑爲長格式。這可能比尋找(n-1)值更容易。 –
我不同意@MasonDeCamillis。數據格式本身並不困難。不過,如果你需要對手的實力,我不明白你能如何計算出實力。你需要某種初始值。 – Roland
@Roland是的,最初的排名將被設置爲0。我相信如果遊戲編號等於1,我可以通過使用ifelse語句來將這些值設置爲0。 – user3319708