plyr包
data(tips,package=”reshape2”)#加载数据集
library(plyr)
head(tips)
基础函数汇总:
aggregate(x=tipstip,by=list(tipssex),FUN=mean)
plyr包函数
ddply(.data=tips,#拆分计算的对象
.variables="sex", #拆分的依据
.fun=function(x){ #计算的函数
mean(tips$tip)
})
ddply()函数,参一是分组的对象,参二是分组的依据,参数三是对分组计算的函数
函数命名规则
a:array d:data.frame l:list
plyr包的主要函数:**ply 首字母代表输入,第二个字母代表输出
如:adply()函数 输入数组,输出数据框
例:
data <- as.matrix(iris[,-5])
result2 <- adply(.data=data,
.margins=2,
.fun=function(x){
each(max,min,median,sd)(x)
})
each()函数是在plyr包中,主要作用是合并多个函数成一个函数,返回一个向量
练习:
用iris数据,对每一种花做一个简单回归。
#定义回归函数
model <- function(x){
lm(Sepal.Length~Sepal.Width,data=x)
}
#对每一组花进行回归
models <- dlply(.data=iris,
.variables=”Species”,
.fun=model)
#计算每个模型的系数
result3 <- ldply(.data=models,
.fun=coef)
result3
Species (Intercept) Sepal.Width
1 setosa 2.639001 0.6904897
2 versicolor 3.539735 0.8650777
3 virginica 3.906836 0.9015345
用普通函数对每一种花做简单回归,则需要做分割,计算,整合三个步骤
pieces <- split(iris,list(iris$Species))#因为lapply函数族的第一个参数是列表或向量
models <- lapply(pieces,model)
result <- lapply(models,coef)
do.call("rbind",result)#整合回归结果
结果:
(Intercept) Sepal.Width
setosa 2.639001 0.6904897
versicolor 3.539735 0.8650777
virginica 3.906836 0.9015345
plyr包其他辅助函数:
上面提到的each函数
x <- rnorm(10)
each(max,min,mean,sd)(x)
colwise()函数对数据框的每一列进行计算,返回一个数据框
colwise(mean,is.numeric)(iris)#计算数值型的列