在R中使用plyr来计算

时间:2013-10-04 21:14:35

标签: r plyr

我正在尝试计算我拥有的数据文件的摘要统计信息。我看过几篇关于类似主题的文章,但他们并没有完全回答我的问题。数据文件包含敏感材料,因此我不想共享它。但是我将使用plyr中的棒球数据来演示我正在尝试做什么。

我正在尝试计算汇总统计表,其中一个统计数据需要计算因子变量的唯一元素。因此,如果我们使用棒球包,我将如何查找每个玩家所玩的球队数量,并将其附加到数据集的其余部分(数据集的其余部分是我在每个数据集上计算的其他摘要统计数据)球员基础)?

ddply(baseball, "id", summarise, total_games=sum(g),    
      still_active=ifelse(max(year) ==‌ 2007,"Yes","No"),
      number_teams=as.data.frame(
          with(baseball[!duplicated(baseball$te‌​am)],table(id))))

上面是一个例子,最后一个参数是我正在努力的那个。我如何找到每个玩家所在的团队数量?我一直在尝试使用as.data.frame(table()),但没有成功。

2 个答案:

答案 0 :(得分:2)

根据评论中的示例,您可以使用以下内容计算团队数量:

ddply(baseball,"id",summarise,total_games=sum(g),
      still_active=ifelse(max(year)==2007,"Yes","No"),
      number_teams=length(unique(team)))

给出了:

            id total_games still_active number_teams
1    aaronha01        3298           No            3
2    abernte02         681           No            7
3    adairje01        1165           No            4
4    adamsba01         482           No            2
5    adamsbo03        1281           No            4
6    adcocjo01        1959           No            5
7    agostju01         543           No            5
8    aguilri01         730           No            4
9    aguirha01         447           No            4
10   ainsmed01        1078           No            5
...

答案 1 :(得分:2)

我是data.table软件包的忠实粉丝 - 一旦你理解了语法,它就会让这个和其他请求变得如此简单:

library(data.table)
bb <- data.table(baseball)
bb[, list(
       games = sum(g), 
       teams = length(unique(team)), 
       home.runs = sum(hr), 
       still.active = max(year) == 2007), 
   by = id]

结果

             id games teams home.runs still.active
   1: ansonca01  2523     3        97        FALSE
   2: forceda01  1029    10         1        FALSE
   3: mathebo01   623     8         1        FALSE
   4: startjo01  1071     6        15        FALSE
   5: suttoez01  1263     4        25        FALSE
  ---                                             
1224: sweenma01  1120     7        42         TRUE
1225: walketo04  1288     7       107         TRUE
1226: witasja01   284     7         0         TRUE
1227: graffto01   974     6        58         TRUE
1228: perezne01  1403     5        64         TRUE

data.table的另一个优点是,它通常更快,因为您可以通过设置密钥对数据表进行排序:

setkey(bb, id)

之后,通过此键(或搜索,或通过...加入)的每个摘要操作都会快得多。您还可以在多个列上设置键。