按变量中的共享值聚合行

时间:2012-04-18 03:45:33

标签: r aggregate plyr

我有一个有点愚蠢的问题。如果我有一个矩阵(或数据框,更容易使用哪个),如:

Year  Match
2008   1808
2008 137088
2008      1
2008  56846
2007   2704
2007 169876
2007  75750
2006   2639
2006 193990
2006      2

我想总结这些年来的每个比赛计数(所以,例如2008年的行将是2008 195743,我将如何做到这一点?我脑子里有一些解决方案但是它们都是不必要的复杂化,R往往会把某些更容易的解决方案藏在某处。

您可以使用以下内容生成相同的矩阵:

structure(c(2008L, 2008L, 2008L, 2008L, 2007L, 2007L, 2007L, 
2006L, 2006L, 2006L, 1808L, 137088L, 1L, 56846L, 2704L, 169876L, 
75750L, 2639L, 193990L, 2L), .Dim = c(10L, 2L), .Dimnames = list(
NULL, c("Year", "Match")))

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:5)

aggregate(x = df$Match, by = list(df$Year), FUN = sum),假设df是您上面的数据框。

答案 1 :(得分:4)

您可能还想使用'plyr'包中的'ddply'功能。

# install plyr package
install.packages('plyr')
library(plyr)
# creating your data.frame
foo <- as.data.frame(structure(c(2008L, 2008L, 2008L, 2008L, 2007L, 2007L, 2007L, 
            2006L, 2006L, 2006L, 1808L, 137088L, 1L, 56846L, 2704L, 169876L, 
            75750L, 2639L, 193990L, 2L), .Dim = c(10L, 2L), .Dimnames = list(
              NULL, c("Year", "Match"))))

# here's what you're looking for
ddply(foo,.(Year),numcolwise(sum))

  Year  Match
1 2006 196631
2 2007 248330
3 2008 195743

顺便说一句,2008年的总金额应该是195743(1808 + 137088 + 1 + 56846),而不是138897你忘记添加56846了。

答案 2 :(得分:3)

如上所述,您可以使用聚合来执行以下操作。但是以一种更简单的方式

aggregate(. ~ Year, df, sum)
#  Year  Match
#1 2006 196631
#2 2007 248330
#3 2008 195743

您也可以使用Dplyr解决此问题,如下所示

library(dplyr)
df %>% group_by(Year) %>% summarise(Match = sum(Match))
#  Year  Match
#  (int)  (int)
#1  2008 195743
#2  2007 248330
#3  2006 196631