使用ddply选择特定的行等

时间:2012-03-26 14:54:31

标签: r plyr

我有一个基于数据框(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)另外,我如何根据得分的目标数量获得每年的计数值,例如,在上述数据中,目标> 20应该给出1992/3的1和1993/4的3

2 个答案:

答案 0 :(得分:1)

如果有多个最佳玩家,那么该表达式将只报告其中一个(特别是该年度数据帧中的第一个)。

对于q2:

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

对于q3:

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

答案 1 :(得分:1)

1 + 2)不,这还不够。您可以更好地查看unique下的Goals值,并在该情况下获取与相应值对应的行。也许是这样的,

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指定是否希望玩家拥有最多,次数最多等目标数。 (显然,这是未经测试的,因此可能需要进行一些小修改。)