R.无需合并即可汇总数据

时间:2011-11-07 20:07:34

标签: r dataframe plyr summarization

我有按日期对各个球队进球的数据框(df)

gamedate teamID Gls
 1992-08-22  CHL  3
 1992-08-22  MNU  1
 1992-08-23  ARS  0
 1992-08-23  LIV  2
 1992-08-24  MNU  0
 1992-08-25  LIV  2
 1992-08-26  ARS  0
 1992-08-26  CHL  0

我希望制作一个汇总表,显示所玩游戏的数量和 这些球队在每个日期都让对手失明的比赛次数

gamedate   games blanks
 1992-08-22   2     0
 1992-08-23   2     1
 1992-08-24   1     1
 1992-08-25   1     0
 1992-08-26   2     2

我可以使用ddply单独获取游戏和空白

df.a <- ddply(df,"gamedate",function(x) c(count=nrow(x)))
df.b <- ddply(subset(df,Gls==0),"gamedate",function(x) c(count=nrow(x)))

然后合并df.a和df.b来得到我的答案。但是,我确信必须有更多 简单而优雅的解决方案

3 个答案:

答案 0 :(得分:3)

您只需使用summarise

阅读以下数据:

   dat <- read.table(textConnection("gamedate teamID Gls
  1992-08-22  CHL  3
  1992-08-22  MNU  1
  1992-08-23  ARS  0
  1992-08-23  LIV  2
  1992-08-24  MNU  0
  1992-08-25  LIV  2
  1992-08-26  ARS  0
  1992-08-26  CHL  0"),sep = "",header = TRUE)

然后拨打ddply

ddply(dat,.(gamedate),summarise,tot = length(teamID),blanks = length(which(Gls == 0)))
    gamedate tot blanks
1 1992-08-22   2      0
2 1992-08-23   2      1
3 1992-08-24   1      1
4 1992-08-25   1      0
5 1992-08-26   2      2

答案 1 :(得分:2)

您唯一缺少的是将函数包装在data.frame()调用中并为其指定列名...并且列名是可选的:)

我正在使用@joran的dat data.frame,因为它允许我测试我的答案。

ddply( dat, "gamedate", function(x) data.frame( 
                                      tot = nrow( x ), 
                                      blanks = nrow( subset(x, Gls == 0 ) ) 
                                              ) 
     )
顺便说一下,上面我搞笑的格式只是为了防止它在屏幕上滚动,并帮助说明我是如何将你已经创建的功能整合在一起的。

答案 2 :(得分:1)

使用简单aggregate的另一种解决方案。我正在使用joran的dat

agg <- aggregate(cbind(1, dat$Gls==0), list(dat$gamedate), sum)
names(agg) <- c("gamedate", "games", "blanks")
agg