R语言-plyr包中的函数

plyr包集中体现了“分离-操作-结合”的数据操作理念。

plyr的核心函数由ddply、llply、laply函数组成,所有的函数名均由五个字母组成且最后三个字母都为ply。函数名的第一个字母代表输入值的类型,第二个字母代表输出值的类型。(plyr是根据单词钳子(plier)仿造出的词,因为钳子是用途广泛且必不可少的常用工具之一)

plyr包中的函数及其输入值和输出值
函数名 输入值类型 输出值类型
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),其计算公式为:

OBP=\frac{H+BB+HBP}{AB+BB+HBP+SF}

其中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)

结果返回了职业生涯中上垒率前十的球员数据。

猜你喜欢

转载自blog.csdn.net/RH_Wang/article/details/81145562
今日推荐