2015-07-21 96 views
1

所以我已經得到了我與R中搞亂了一些高爾夫球場數據:使用dplyr :: summarize()函數進行多步算術過程?

player rd hole shot distToPin distShot 
E. Els 1 1  1  525   367.6 
E. Els 1 1  2  157.4  130.8 
E. Els 1 1  3  27.5  27.4 
E. Els 1 1  4  1.2   1.2 
E. Els 1 2  1  222   216.6 
E. Els 1 2  2  6.8   6.6 
E. Els 1 2  3  0.3   0.3 
E. Els 2 1  1  378   244.4 
E. Els 2 1  2  135.9  141.6 
E. Els 2 1  3  6.7   6.9 
E. Els 2 1  4  0.1   0.1 

我試圖做一個「效率」的計算。基本上,我想通過一輪計算下面的公式(我做出了決定,如果你不能告訴):

E = hole yardage/(sum(distance of all shots) - hole yardage) 

最終,我想我的結果是這樣的:

  rd  efficiency 
E.Els  1  205.25 
      2  25.2 

efficiency列是整個回合中每個洞的效率的平均結果。說我遇到的問題是我不能完全弄清楚如何使用dplyr做這樣一個複雜的計算::總結():

efficiency <- df %>% 
group_by(player, rd) %>% 
summarize(efficiency = (sum(distShot) - distToPin)) 

但與特定的腳本的問題是,它返回錯誤:

Error: expecting a single value 

我想我的問題是,是它運行,這將無法分辨哪個distToPin減去,和一個我想顯然是每個孔的第一distToPin,或者準確的孔(不幸的是,我沒有一列「孔碼」,我想把每個孔的第一個distToPin拉出來,並在我的summarize()算法中使用它,這甚至可能嗎?

我猜測有一種方法可以在總結功能中完成這些類型的複雜多步計算,但也許並不存在!任何想法或建議?

+0

我認爲這將有助於寫出所有你需要讓你的最終計算,然後嘗試編寫涵蓋所有這些管道代碼的步驟。你的代碼沒有包含的一步,但你明確需要的是計算每個鏡頭的距離,以便在隨後的步驟中可以按孔計算這些距離。 – ulfelder

+1

'summarize'設計用於在您的公式與原始數據的大小相同時返回每個聚合的單個值,因此您應該使用'mutate'來代替。雖然真的不清楚嘗試做什麼。 –

+0

我已經修改了這一點,並意識到你無法用你得到的數據來計算你的統計數據。對於任何一個球洞上的任何一名球員,即使他或她在某些球杆上擊球離球洞較遠,其與球洞的距離總是等於球洞的長度。它總是必須達到零,對吧?所以你需要直接觀察鏡頭距離才能獲得效率統計。 – ulfelder

回答

1

你似乎錯過了一些步驟。這是一個刻意編輯的版本,用dplyr表示。它假定您的數據幀被命名爲golfdf

golfdf %>% 
    group_by(player, round, hole) %>% 
    summarise(hole.length = first(distToPin), shots.length = sum(distShot)) %>% 
    group_by(player, round) %>% 
    summarise(efficiency = sum(hole.length)/(sum(shots.length) - sum(hole.length))) 
+0

對不起,我在那裏黑了一分鐘。無論如何,你是對的 - 不知道爲什麼我的鏡頭數據沒有複製,但我編輯了OP來包含鏡頭數據。 – skathan

+0

所以最終的答案只是上面的腳本減去mutate()的兩行來創建一個人造distShot。如果你想更新答案,請隨意。我要編輯它,但不知道如何解決答案的其餘部分。 – skathan

+0

謝謝,是的,我應該編輯答案以追上新版本的數據。我會做一點。 – ulfelder

相關問題