在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)