在R中按数量级汇总数据

时间:2013-11-22 04:54:08

标签: r aggregate

假设这个数据集:

df = data.frame(city=c(A,A,A,B,B,C,C,C,C), party=c(D,R,I,D,R,D,R,I,U), votes=c(10,2,9,7,2,1,7,3,8))

我想计算每个城市最多和第二多的投票方之间的投票差异。但每个城市都有两个以上的政党。我想要的结果是:

city vote.diff
 A       1
 B       5
 C       1

任何帮助?

1 个答案:

答案 0 :(得分:3)

用于测试的数据框。模仿上面的伪代码:

df = data.frame(city=c('A','A','A','B','B','C','C','C','C'), 
                party=c('D','R','I','D','R','D','R','I','U'), 
                votes=c(10,2,9,7,2,1,7,3,8))

代码:

resV <- lapply(split(df, df$city), function(df.x){
                      res <- xtabs(votes~party, data=df.x); 
                     -diff( res[ order(res,decreasing=TRUE) ][1:2]) } )
data.frame(city=names(resV), 
           vote.diff=unlist(resV), 
            winner=names(unlist(resV)) )

    city vote.diff winner
A.I    A         1    A.I
B.R    B         5    B.R
C.R    C         1    C.R

如果你想省略胜利者专栏,那应该是一个微不足道的修复。