前言:用MATLAB来处理数据的时候,由于缺乏简单的分组,归并这些功能(matlab的dataframe的功能很难用),处理数据来总是不是很方便,而R里面的plyr、dplyr、reshape2包就是用来干这些脏活的。23333

首先给出说明下这个包是用来干什么,以及输入是什么(资料来源于网上)

plyr:用来切割,计算,合并数据的包,可以输入的格式是list、array和dataframe

废话少说,介绍plyr包

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

下面是其他操作函数

接下来,我会对dplyr,reshape2,rlist包都讲述一遍他们的故事,希望能够整理出基于R的数据清洗和整理的完整教程。