使用reshape + cast聚合多个列

Dam*_*nJW 1 r reshape

在R中,我有一个数据框,其中包含Seat(factor),Party(factor)和Votes(numeric)的列.我想创建一个摘要数据框,其中包含Seat,Winning party和Vote share的列.例如,来自数据框

df <- data.frame(party=rep(c('Lab','C','LD'),times=4),
                 votes=c(1,12,2,11,3,10,4,9,5,8,6,15),
                 seat=rep(c('A','B','C','D'),each=3))
Run Code Online (Sandbox Code Playgroud)

我想得到输出

  seat winner voteshare
1    A      C 0.8000000
2    B    Lab 0.4583333
3    C      C 0.5000000
4    D     LD 0.5172414
Run Code Online (Sandbox Code Playgroud)

我可以弄清楚如何实现这一目标.但我确信必须有一个更好的方法,可能是使用Hadley Wickham的reshape包裹的狡猾的单线.有什么建议?

对于它的价值,我的解决方案使用我的包中的函数, djwutils_2.10.zip并按如下方式调用.但是有各种特殊情况它没有处理,所以我宁愿依赖别人的代码.

aggregateList(df, by=list(seat=seat),
              FUN=list(winner=function(x) x$party[which.max(x$votes)],
                       voteshare=function(x) max(x$votes)/sum(x$votes)))
Run Code Online (Sandbox Code Playgroud)

koh*_*ske 11

Hadley的plyr包装可以帮助您:

ddply(df, .(seat), function(x) data.frame(winner=x[which.max(x$votes),]$party, voteshare=max(x$votes)/sum(x$votes)))
Run Code Online (Sandbox Code Playgroud)

  • 或者,更简洁(并且很快会更快):`ddply(df,.(座位),总结,赢家=派对[which.max(投票)],votehare = max(投票)/ sum(票))) (2认同)