【问题标题】:selecting specific rows etc. using ddply使用 ddply 选择特定行等
【发布时间】:2012-03-26 14:54:31
【问题描述】:

我有一个基于数据框(df 是示例行)的三部分问题,该数据框包含足球运动员在一个赛季中的进球数

 Player           Season  Goals
 Teddy Sheringham 1992/3   22
 Les Ferdinand    1992/3   20
 Dean Holdsworth  1992/3   19
 Andy Cole        1993/4   34
 Alan Shearer     1993/4   31
 Chris Sutton     1993/4   25

如果我想获得每年的最佳射手我可以使用

ddply(df, "Season", summarise, maxGoals = max(Goals),
      Player=Player[which.max(Goals)])

问题:

1) 在这种情况下不适用,但如果有并列得分最高的人就足够了

2) 我对每个赛季的亚军也很感兴趣。我玩过目标降序和索引 2 的排序,但没有找到解决方案

3) 另外,我将如何根据进球数获得每年的计数值,例如,根据上述数据,1992/3 和 1993/4 的进球数>20 应为 1

【问题讨论】:

  • 您应该使用dput 创建数据框的可重现版本,这将有助于人们回答

标签: r plyr


【解决方案1】:

如果有多个最佳玩家,则该表达式将仅报告其中一个(具体而言,该年数据框中的第一个)。

第二季度:

d = ddply(df, "Season", summarise, SecondPlayer=Player[order(Goals)[length(Goals)-1]])

第三季度:

d = ddply(df, "Season", summarise, Count=sum(Goals > 20))

【讨论】:

  • 谢谢。我会跟进 dput 的建议。反正你似乎已经理解我的问题了:)
【解决方案2】:

1+2) 不,这还不够。查看Goals 下的unique 值并在这种情况下获取与适当值对应的行,您可能会更幸运。也许像,

myFun <- function(x,k){
    val <- sort(unique(x$Goals))
    Players <- x$Players[x$Goals == val[k]]
    data.frame(Players = Players, maxGoals = rep(val[k],length(Players)))
}

ddply(df,.(Season),myFun,k = 1)

您可以在其中使用参数k 指定您是否想要进球最多、第二多等的球员。 (显然,这是未经测试的,因此可能需要进行一些小的修改。)

【讨论】:

  • 感谢您的建议。我会跟进的。有点惊讶没有更简单的解决方案,因为它一定是常见的情况
  • @pssguy 我认为我们对“简单解决方案”的概念可能略有不同。 :)
  • 任何超过 20 个括号的东西都让我头晕目眩!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多