2015-07-21 94 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

相关问题