前言:用MATLAB来处理数据的时候,由于缺乏简单的分组,归并这些功能(matlab的dataframe的功能很难用),处理数据来总是不是很方便,而R里面的plyr、dplyr、reshape2包就是用来干这些脏活的。23333
首先给出说明下这个包是用来干什么,以及输入是什么(资料来源于网上)
plyr:用来切割,计算,合并数据的包,可以输入的格式是list、array和dataframe
废话少说,介绍plyr包
plyr包是Hadley Wickham大神为解决split – apply – combine问题而写的一个包,其动机在与提供超越for循环和内置的apply函数族的一个一揽子解决方案。使用plyr包可以针对不同的数据类型,在一个函数内同时完成split – apply – combine三个步骤。
plyr包函数的命名非常有规律,因此,非常容易记忆。plyr包的主函数是**ply形式的,其中首字母可以是(d、l、a),第二个字母可以是 (d、l、a、_ ),不同的字母表示不同的数据格式,d表示数据框格式,l表示列表,a表示数组,_则表示没有输出。第一个字母表示输入的待处理的数据格式,第二个字母表示输出的数据格式。例如ddply函数,即表示输入一个数据框,输出也是一个数据框。
我们用iris数据集分析下这个包的使用,其中包括了一个分类变量和四个数值变量。我们希望数据按不同类别,分别计算数值变量的均值。
library(plyr)
## Warning: package 'plyr' was built under R version 3.2.1
data(iris)
# 用aggregate函数进行数据汇总
k<-aggregate(iris[1:4],list(iris$Species),mean)
# 原代码是ddply(iris,.(Species),function(df) mean(df[1:4])),
# 错误在于数据框的统计应该用colMeans
ddply(iris,.(Species),function(df) colMeans(df[1:4]))
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 5.006 3.428 1.462 0.246
## 2 versicolor 5.936 2.770 4.260 1.326
## 3 virginica 6.588 2.974 5.552 2.026
这个例子并没有显示出什么优势,但我们可以学习到plyr的基础使用方式,即对于**ply这种格式的函数,其第一个数据参数是数据源,其他参数可以用?来查询.
library(nnet)
# 确定建模函数
nnet.m <- function(...) {
nnet(Species~.,data=iris,trace=F,...)
}
# 确定输入参数
opts <- data.frame(size=1:10,maxiter=50)
# 建立预测准确率的函数
accuracy <- function(mod,true) {
pred <- factor(predict(mod,type='class'),levels=levels(true))
tb <- table(pred,true)
sum(diag(tb))/sum(tb)
}
# 用mlply函数建立包括10个元素的列表,每个元素包括了一个建模结果
models <- mlply(opts,nnet.m)
# 再用ldply函数读取列表,计算后得到最终结果
ldply(models,'accuracy',true=iris$Species)
## size maxiter accuracy
## 1 1 50 0.2666667
## 2 2 50 0.9933333
## 3 3 50 0.9933333
## 4 4 50 1.0000000
## 5 5 50 1.0000000
## 6 6 50 0.9866667
## 7 7 50 1.0000000
## 8 8 50 0.9933333
## 9 9 50 0.9933333
## 10 10 50 0.9933333
下面是其他操作函数
each():each(min, max)等价于function(x) c(min = min(x), max = max(x))。
colwise():colwise(median)将计算列的中位数。
arrange():超级顺手的函数,可以方便的给dataframe排序。
rename():又是一个handy的函数,按变量名而不是变量位置重命名。
count():返回unique值,等价于length(unique(**))。
match_df():方便的配合count()等,选出符合条件的行,有点像merge(…,all=F)的感觉。
join():对于习惯SQL的童鞋,可能比merge()用起来更顺手吧(当然也更快一点),不过灵活性还是比不上merge()。
接下来,我会对dplyr,reshape2,rlist包都讲述一遍他们的故事,希望能够整理出基于R的数据清洗和整理的完整教程。