2014-02-17 22 views
2

如果之前有人問過我,我很抱歉,我很難弄清楚如何將我的搜索字詞發現以找到我要找的內容。我正在尋找一種方法來計算數據框中的一列,該數據框使用先前計算的同一列中的值(計算必須按特定順序完成)。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)))} 
+0

這是R A棘手的問題 - 你認爲你的數據重塑到大幅面有每隊一行,該行中所有的遊戲數據?然後,您可以計算一組排名變量(每場比賽後一個),然後重塑爲長格式。這可能比尋找(n-1)值更容易。 –

+1

我不同意@MasonDeCamillis。數據格式本身並不困難。不過,如果你需要對手的實力,我不明白你能如何計算出實力。你需要某種初始值。 – Roland

+0

@Roland是的,最初的排名將被設置爲0。我相信如果遊戲編號等於1,我可以通過使用ifelse語句來將這些值設置爲0。 – user3319708

回答

1

應該有一個更好的,更有效的方法要做到這一點,但我只能想出一個(希望有效的)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) 
相關問題