2

我有一个数据框(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 得到我的答案。但是,我相信一定有一个更简单优雅的解决方案

4

3 回答 3

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
于 2011-11-07T20:19:51.333 回答
2

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

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

ddply( dat, "gamedate", function(x) data.frame( 
                                      tot = nrow( x ), 
                                      blanks = nrow( subset(x, Gls == 0 ) ) 
                                              ) 
     )

顺便说一句,我上面有趣的格式只是为了防止它在屏幕上滚动并帮助说明我是如何真正将您已经创建的功能组合在一起的。

于 2011-11-07T20:51:18.683 回答
1

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

agg <- aggregate(cbind(1, dat$Gls==0), list(dat$gamedate), sum)
names(agg) <- c("gamedate", "games", "blanks")
agg
于 2011-11-07T20:57:00.003 回答