R数据加工厂-plyr包

plyr包的基本函数:
**主函数:ply() 函数族
aaply()函数、adply()函数、alply()函数、daply()函数、ddply()函数、dlply()函数、mply()函数
按输入分类,:分为a
ply(), dply(), lply()三大类:
aply(.data, .margins, .fun, …, .progress = “none”)
d
ply(.data, .variables, .fun, …, .progress = “none”)
lply(.data, .fun, …, .progress = “none”)
参数:.data是要进行处理的数组
.margins是用哪种方式去切割数据,取值为1,2,c(1,2)
.fun是对切割的数据指定一个函数进行处理
.progress决定是否显示及用哪种方式显示进度条
.variables指定要按其分割的变量名称
按输出格式来分类:分为
aply()、dply()、lply()、_ply()
m
ply(.data,.fun=NULL,.inform=FALSE,…)
把array或者dataframe的参数数值放进函数中,得到dataframe(mdply),array(maply)或者list(mlply)
install.packages(“plyr”)

#对每列求均值(aply()函数)
library(plyr)
a=matrix(1:21,nrow=3,ncol=7)
b=aaply(a,.margins=2,.fun=mean)
aaply(a,2,.fun=mean)
aaply(a,1,mean,.progress=“text”)
#按变量分组求均值(d
ply()函数)
names=c(“John”,“Mary”,“Alice”,“Peter”,“Roger”,“Phyillis”)
age=c(13,15,14,13,14,13)
sex=c(“Male”,“Female”,“Female”,“Male”,“Male”,“Female”)
data=data.frame(names,age,sex)
amean=function(data)
{
agemean=mean(data[,2])
return(agemean)
}
daply(data,.(age),.fun=amean)
ddply(data,.(age,sex),.fun=amean)
dlply(data,.(sex),.fun=amean)
#分组求函数(l*ply()函数)
a=c(1,2,3,4,1,5,7,8,9,4,2)
b=c(1,2,5,7,6,4,8,7)
c=c(4,8,9,1,2,3,1)
list=list(a,b,c)
list
llply(list,mean)
laply(list,mean)
ldply(list,mean)

#m*ply函数的应用
data=data.frame(n=c(10,100,50),mean=c(5,5,10),sd=c(1,2,1))
mlply(data,rnorm)
辅助函数(以函数作为输入,以新的函数作为输出):
mply()函数、splat()函数、each()函数、colwise()函数、failwith()函数、as.data.frame.function()函数、arrang()函数、rename()函数、count()函数、match_df()函数、join()函数
splat()函数
作用:与使用众多的参数不同,该函数把原函数中多个参数打包为一个list作为参数,然后输出新的函数
优点:当你想把数据框或者数组里的一行的数据作为参数赋给一个函数,用splat()函数就可以省去人为把数据框拆分的麻烦
each(.fun)
作用:用一系列的函数作用在输入的数据上,并返回一个已命名的向量
不足:不能给作用的函数指定附加的参数
colwise(.fun, .cols, …)
作用:把作用于数据框行向量的函数(如mean,median)转化为作用于数据框列向量的函数,可以结合base R 的函数使用,与d
ply一起使用时十分方便
参数: .fun是要转化的函数;.cols可以是测试数据框的列是否应包含的判别函数或者是·要包含的列的名称
另外还有衍生的catcolwise()和numcolwise()函数,它们分别针对的是函数只在离散和数值型的变量上操作
failwith(default=NULL, f, quiet=FALSE)
作用:修正一个函数,使得当该函数出现错误时返回一个默认值
参数:default;f是要修正的函数;quiet是设定错误信息是否显示,默认值为FALSE,为显示要返回的默认值示错误信息
arrange(df, .(var1), .(var2)…)
作用:按照列给数据框排序
参数:df为数据框;.var是要按照排序的变量
rename(x, replace, warn_missing=TRUE)
作用:通过名字修改名字,而不是根据它的位置
参数:x是要操作的数据;replace是指定的替换的字符向量(包括新的和旧的字符);warm_missing是指定当旧的字符不存在于x的时候,是否显示错误信息,默认值为TRUE,表示显示此信息
count(df,vars=NULL, wt_var=NULL)
作用:数变量中观测值出现的个数
参数:df是要处理的数据框;vars是指定要进行数数的变量;wt_var是指定作为权重的变量
match_df(x, y, on=NULL)
作用:从一个数据框中提取与另一个数据框中相同的行
参数:x是原始的需要提取的数据框;y是用来找出相同行的另一个数据框;on是指定要来比对的变量,默认为比较两个数据框中所有的变量
join(x, y, by=NULL, type=“left”, match=“all”)
作用:联合两个数据框
参数:x,y是两个数据框;by是指定要联合的变量,默认值为所有的变量;type是指定联合的方式
#splat()函数
head(mtcars,5)
hp_per_cyl<-function(hp, cyl, …) hp/ cyl
splat(hp_per_cyl)(mtcars[1,])
splat(hp_per_cyl)(mtcars)
#m*ply
(a_matrix, FUN)的作用和aply(a_matrix,1,splat(FUN))一样
data=data.frame(n=c(10,100,50),mean=c(5,5,10),sd=c(1,2,1))
mlply(data,rnorm)
alply(data,1,splat(rnorm))
#each()函数
a=c(1,2,3,4,1,5,7,8,9,4,2)
each(min,max,mean)(a)
each(length,mean,var)(rnorm(100))
#colwise()函数
nmissing=function(x) sum(is.na(x))
nmissing(baseball)
colwise(nmissing)(baseball)
ddply(baseball,.(year),colwise(nmissing,c(“sb”,“cs”,“so”)))
ddply(baseball,.(year),colwise(nmissing,is.numeric))
ddply(baseball,.(year),colwise(nmissing,is.discrete))
#failwith()函数(修改函数报错信息)
f=function(x)if(x==1)stop(“Error!”)else 1
f(1)
safef=failwith(NULL,f,quiet=TRUE)
safef(1)
#arrange()函数
arrange(mtcars,cyl,disp)
cars=cbind(vehicle=row.names(mtcars),mtcars) #添加行名
arrange(cars,cyl,disp)
#rename()函数
x=c(“a”=1,“b”=2,“c”=3,“d”=“c”)
rename(x,replace=c(“c”=“e”))
#count()函数
a=data.frame(names=c(“a”,“b”,“c”,“d”,“a”,“a”,“a”,“b”,“b”,“c”),wt=c(1,1,1,1,2,2,2,2,2,2))
count(a,vars=“names”)
count(a,vars=“names”,wt_var=“wt”) #等价于count(a,“names”,“wt”)
count(a,c(“names”,“wt”))
#match_df()函数
count(baseball,“id”)
longterm=subset(count(baseball,“id”),freq>25)
bb_longterm=match_df(baseball,longterm,on=“id”)
bb_longterm
#join()函数
x1=c(1,2,3,4)
x2=c(5,6,7,8)
x=data.frame(x1,x2)
y1=x1
10
y=data.frame(y1,x2)
y[,2]=c(1,2,6,7)
join(x,y,by=“x2”)
join(x,y,“x2”,type=“right”)
案例分析:
baseball案例
注:transform()作用:为原数据框添加新的列,改变原变量列的值,还可通过赋值NULL删除列变量。

例:transform(test,zimu=c(‘a’,‘b’,‘c’,‘d’,‘e’,‘f’),demond=NULL)
library(plyr)
head(baseball,5)
#求某一选手职业生涯时间
baberuth<-subset(baseball, id == “ruthba01”)
baberuth<-transform(baberuth, cyear= year -min(year) + 1)
#求所有选手的职业生涯时间
baseball <-ddply(baseball, .(id), transform,cyear= year -min(year) + 1)
baseball =na.omit(baseball) #去除有空值的行
#生成所有人的rbi/ab的时间序列图并保存到pdf中
baseball <-subset(baseball, ab >= 25)
xlim<-range(baseball c y e a r , n a . r m = T R U E ) y l i m < r a n g e ( b a s e b a l l cyear, na.rm=TRUE) ylim<-range(baseball rbi/ baseballKaTeX parse error: Expected 'EOF', got '#' at position 246: …RUE) dev.off() #̲对ruthba01做线性回归 …r.squared
bcoefs<-ldply(bmodels, function(x) c(coef(x), rsquare= rsq(x)))
names(bcoefs)[2:3] <-c(“intercept”, “slope”)
head(bcoefs,5)
View(bcoefs)
#查看线性方程拟合效果
hist(bcoefsKaTeX parse error: Expected 'EOF', got '#' at position 32: …0,col="black") #̲找出拟合得较好的模型 base…id
match_df(baseball,subset(baseballcoef, rsquare>0.999),on=“id”)
Ozone案例
library(ggplot2)
library(plyr)

#研究位置(1,1)在不同时点臭氧水平的变化。

#方法一:按照所有时间点画出折线图
value <-ozone[1, 1, ]
time <-1:72 / 12
plot(c(1:72),value,main=NULL,xlab=“time”,ylab=“value”,type=“l”)
box(bty=“l”)
grid(nx=NA,ny=NULL,lty=1,lwd=1,col=“gray”)
注:grid()函数可以在绘图的基础上添加网格线,其参数主要包括:ny用于设置水平网格的数目,nx用于设置垂直网格的数目。当设置为NA时,表示不绘制网格线。

#方法二:对不同年份按时点画出折线图
plot(value[1:12],type=“b”,pch=19,lwd=2,xaxt=“n”,col=“black”,
xlab=“month”,ylab=“value”)

#用字符串标记横坐标
axis(1,at=1:12,labels=c(“Jan”, “Feb”, “Mar”, “Apr”, “May”,“Jun”, “Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”))
lines(value[13:24],col=“red”,type=“b”,pch=19,lwd=2)
lines(value[25:36],col=“orange”,type=“b”,pch=19,lwd=2)
lines(value[37:48],col=“purple”,type=“b”,pch=19,lwd=2)
lines(value[49:60],col=“blue”,type=“b”,pch=19,lwd=2)
lines(value[61:72],col=“green”,type=“b”,pch=19,lwd=2)
#制作图例
legend(“bottomright”,legend=c(“1995”,“1996”,“1997”,“1998”,“1999”,“2000”),lty=1,lwd=2,pch=rep(19,6),col=c(“black”,“red”,“orange”,“purple”,“blue”,“green”),ncol=1,bty=“n”,cex=1.2,text.col=c(“black”,“red”,“orange”,“purple”,“blue”,“green”),inset=0.01)
#对位置(1,1),以月份为自变量,做一个稳健线性回归
month.abbr<-c(“Jan”, “Feb”, “Mar”, “Apr”, “May”,“Jun”, “Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”)
month <-factor(rep(month.abbr, length = 72), levels = month.abbr)
year <-rep(1:6, each = 12)
library(“MASS”)
deseas1 <-rlm(value ~ month -1)
summary(deseas1)
#观察稳健回归模型的系数
coef(deseas1)
plot(unname(coef(deseas1)),type=‘l’)
#对所有24×24=576个位置做稳健线性回归
deseasf<-function(value) rlm(value ~ month -1, maxit= 50)
models <-alply(ozone, 1:2, deseasf)
#用failed储存无法实现稳健线性回归的位置
failed <-laply(models, function(x) !xKaTeX parse error: Expected 'EOF', got '#' at position 12: converged) #̲提取所有模型的系数和残差 co…value)
monthsurface<-function(mon) #画图函数
{
df<-subset(coefs_df, month == mon)
qplot(long, lat, data = df, fill = value, geom=“tile”) +
scale_fill_gradient(limits = coef_limits,
low = “lightskyblue”, high = “yellow”)
}
monthsurface(“Jan”)
monthsurface(“Jul”)
#画出所有的图并保存到pdf中
pdf(“ozone-animation.pdf”, width = 8, height = 8)
l_ply(month.abbr, monthsurface, .print = TRUE)
dev.off()

发布了30 篇原创文章 · 获赞 0 · 访问量 340

猜你喜欢

转载自blog.csdn.net/hua_chang/article/details/105035762
今日推荐