我正在尝试计算我拥有的数据文件的摘要统计信息。我看过几篇关于类似主题的文章,但他们并没有完全回答我的问题。数据文件包含敏感材料,因此我不想共享它。但是我将使用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$team)],table(id))))
上面是一个例子,最后一个参数是我正在努力的那个。我如何找到每个玩家所在的团队数量?我一直在尝试使用as.data.frame(table())
,但没有成功。
答案 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)
之后,通过此键(或搜索,或通过...加入)的每个摘要操作都会快得多。您还可以在多个列上设置键。