R语言-plyr包中的函数
程序员文章站
2022-04-24 08:28:35
...
plyr包集中体现了“分离-操作-结合”的数据操作理念。
plyr的核心函数由ddply、llply、laply函数组成,所有的函数名均由五个字母组成且最后三个字母都为ply。函数名的第一个字母代表输入值的类型,第二个字母代表输出值的类型。(plyr是根据单词钳子(plier)仿造出的词,因为钳子是用途广泛且必不可少的常用工具之一)
函数名 | 输入值类型 | 输出值类型 |
---|---|---|
ddply |
数据框 |
数据框 |
llply | 列表 | 列表 |
aaply | 数组/相量/矩阵 | 数组/相量/矩阵 |
dlply | 数据框 | 列表 |
daply | 数据框 | 数组/相量/矩阵 |
d_ply | 数据框 | 无 |
ldply | 列表 | 数据框 |
laply | 列表 | 数组/相量/矩阵 |
l_ply | 列表 | 无 |
adply | 数组/相量/矩阵 | 数据框 |
alply | 数组/相量/矩阵 | 列表 |
a_ply | 数组/相量/矩阵 | 无 |
1.ddply
函数ddply()以数据框为输入值,根据几个变量对其分类并做相应的运算,最后返回一个数据框。
以plyr包中的baseball数据为例:
library(plyr)
head(baseball)
在棒球比赛中一个常用的统计数据为上垒率(OBP),其计算公式为:
其中H为安打,BB为四坏保送,HBP为触身球,AB为打数,SF为高飞牺牲打。
在1954年之前,高飞牺牲打被算为牺牲打的一部分,且其还包括短打,所以1954年之前球员的高飞牺牲打数据假定为0.这是需要对原数据做的第一个改变。还有原始数据中HBP有许多缺失值,我们应该设其为0。此外,我们还剔除了一个赛季少于50打数的球员数据。
首先将1954年之前的sf数据设为0,并检测sf数据有没有缺失值
baseball$sf[baseball$year<1954]<-0
any(is.na(baseball$sf))
[1] FALSE
结果显示没有缺失的sf值
再将HBP中的缺失值设为0,并检测
baseball$hbp[is.na(baseball$hbp)]<-0
any(is.na(baseball$hbp))
[1] FALSE
然后剔除一个赛季少于50打数的球员数据
baseball<-baseball[baseball$ab>=50,]
添加一个新变量OBP,按OBP公式操作
baseball$OBP<-with(baseball,(h+bb+hbp)/(ab+bb+hbp+sf))
tail(baseball)
为了计算每个球员在其整个职业生涯的OBP指标,就不能仅仅平均其在单个赛季的OBP,这需要对分子和分母上的变量同时求和并用分子除以分母。这样的操作可以用ddply函数完成。
首先定义一个做以上运算的函数,并通过ddply调用使其运用到每一个球员的数据上。
obp<-function(data)
+ {
+ c(OBP=with(data,sum(h+bb+hbp)/sum(ab+bb+hbp+sf)))
+ }
careerOBP<-ddply(baseball,.variables='id',.fun=obp)
careerOBP<-careerOBP[order(careerOBP$OBP,decreasing=TRUE),]
head(careerOBP,10)
结果返回了职业生涯中上垒率前十的球员数据。