作者:leengsmile
链接:https://www.jianshu.com/p/bfddfe29aa39
來源:简书
一、使用的数据集
| year| name| percent| sex|
|---------:||---------:||---------:||---------:|
| 1880| John| 0.081541| boy|
| 1880| William| 0.080511| boy|
| 1880| James| 0.050057| boy|
| 1880| Charles| 0.045167| boy|
| 1880| George| 0.043292| boy|
| 1880| Frank| 0.02738| boy|
| 1880| Joseph| 0.022229| boy|
| 1880| Thomas| 0.021401| boy|
该表是美国新生儿的取名汇总表。
二、plyr包函数
1、每年包含的记录数
record_count <- function(df) {
return(data.frame(count = nrow(df)))
}
ddply(baby_names, # 数据集
.(year), # 分类的标准
record_count # 函数
)
2、男孩、女孩名的各自排名
以2008年的数据为例,男孩名"Jacob"的比例最高,排名应当是第一,"Michael"紧跟其后,排名应当第二,依此类推。对于女孩名,"Emma"排名第一,"Isabella"排名第二,"Emily"排名第三等等。我们希望得到这样的结果。
对于2008年的数据,可以通过简单的rank
即可得到,不过要对男孩和女孩分别排序。
baby_names_2008_boy <- subset(baby_names_2008, sex == "boy") # 获取男孩名
baby_names_2008_boy$rank <- rank(- baby_names_2008_boy$percent) # 排序
head(baby_names_2008_boy) # 查看
使用ddply函数
ddply(baby_names,
.(year, sex),
transform,
rank = rank(-percent, ties.method = "first")
)
3、排名前100的男孩名与女孩名在当年中的比例
baby_names_top100 <- subset(baby_names, rank <= 100) # 将前100排名的数据筛选出来
baby_names_top100_trend <- ddply(baby_names_top100,
.(year, sex), # 按年和性别分割
summarize, # 汇总数据
trend = sum(percent)) # 汇总方式(求和)
这里出现一个新的操作函数summarize()
,该函数是对数据做汇总,与transform
不一样的是,该函数并不追加结果到原始数据,而是产生新的数据集。比如想知道,2008年的男孩名中,排名最高和最低的名字的百分比之差,可以通过如下方式求得:
summarize(baby_names_2008_boy, trend = max(percent) - min(percent))
# 0.010266