我有一个有点愚蠢的问题。如果我有一个矩阵(或数据框,更容易使用哪个),如:
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")))
感谢您提供的任何帮助。
答案 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