[Rpackage]R语言plyr包使用方法——可进行类似数据透视表的操作

作者: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

猜你喜欢

转载自blog.csdn.net/TOMOCAT/article/details/81632137