R for data science(十七)plyr
2018-10-02 本文已影响21人
一路向前_莫问前程_前程似锦
R数据处理包plyr:超越apply函数族的向量化运算
plyr包的设计理念在于切分(split)- 处理(apply)- 整合(combine)这样的一个数据处理流程,具体来说就是先对数据进行单/多变量或者维度的分割,然后对分割后的子数据集应用目标函数进行处理,最后将各子集处理后的结果汇集起来进行返回。这样的一套数据处理流程的方便之处在于 plyr提供了16个有命名规律的核心函数,这些函数可以对各类输入数据经整合处理之后输出为指定的数据结构,简单易用方便快捷的实现数据变换和处理工作。
plyr包核心函数
image.pngplyr包16个核心函数的命名都有相应的规律,函数具体形式如 XXply
,第一个 X
表示输入的R数据类型,第二个 X
表示需要输出的R数据类型,具体 X
的取值主要有:
a:array
d:data.frame
l:list
m:multiple inputs
_:nothing
比如说 adply就表示输入为数组结构输出为数据框形式, dlply就表示输入为数据框形式输出为列表形式,诸如此类。 plyr包16个核心函数如下:
image.png
至于这些函数的具体用法,其实也是有规律可循的
当输入对象为数组的时候 array
公式为
a*ply函数格式
aaply(.data = ,.margins = ,.fun = ,...,.progress = 'none',.inform = FALSE)
adply(.data = ,.margins = ,.fun = ,...,.progress = 'none'.inform = FALSE)
alply(.data = ,.margins = ,.fun = ,...,.progress = 'none'.inform = FALSE)
a_ply(.data = ,.margins = ,.fun = ,...,.progress = 'none'.inform = FALSE)
.data可以是数组也可以是矩阵;
.margins指定要分析的数组或矩阵的维度,即行维(.margins = 1)还是列维(.margins = 2);
.fun为行维或列维指定需要处理的函数,可以是R自带的函数,
如sum(),mean()等,也可以是自定义函数;
...为指定函数的其他参数;
.progress指定以什么样的方式展示程序运行的进度,默认不显示进度,
还可以选择"text"(文本进度条), "tk"(tk进度条), 和"win"(Windows系统自带的进度条);
.inform是否指定报错信息,默认不指定,因为设为TRUE的话,将降低程序的执行效率,但该参数对Bug处理是有帮助的。
当输入对象为数据框的时候 dataframe
中间多了一个.variables
,代表的是分组变量,可以为多个因素分组
#d*ply函数格式
daply(.data = ,.variables = ,.fun = ,...,.progress = 'none',.inform = FALSE)
ddply(.data = ,.variables = ,.fun = ,...,.progress = 'none',.inform = FALSE)
dlply(.data = ,.variables = ,.fun = ,...,.progress = 'none',.inform = FALSE)
d_ply(.data = ,.variables = ,.fun = ,...,.progress = 'none',.inform = FALSE)
.data指定为数据框数据;
.variables指定数据框中的分组变量;
.fun基于分组变量,可对数据框中的其余变量指定某种函数,可以是R自带的函数,如sum(),mean()等,也可以是自定义函数,类似于聚合分析;
.progress和.inform与a*ply函数参数一致。
ddply函数的用法为例:
ddply(.data, .variables, .fun = NULL, ..., .progress =
"none",.inform = FALSE, .drop = TRUE, .parallel = FALSE, .paropts = NULL)
其中 .data
自然是待处理的输入数据,
在 ddply函数里指的是data frame
;
.variables
指的是用来对数据框进行分割的参数,可以是数据变量
、式子
或者一个字符串向量
;
.fun
就是应用在各个划分后的子数据集
上的函数,核心参数就这三个,其他参数均是可选的,具体不在此一一释义。
注意 variables = .(iris$Species),.(iris$Species)
有一个点号哦
#构建自定义函数
fun <- function(data) apply(data,2,mean)
daply(.data = iris[,1:4],.variables = .(iris$Species),.fun=fun)
ddply(.data = iris[,1:4],.variables = .(iris$Species),.fun=fun)
dlply(.data = iris[,1:4],.variables = .(iris$Species),.fun=fun)
d_ply(.data = iris[,1:4],.variables = .(iris$Species),.fun=fun)
image.png
#创建一个数据框
dfx <- data.frame(
group = c(rep( 'A' , 8 ), rep( 'B' , 15 ), rep( 'C' , 6 )),
sex = sample(c( "M" , "F" ), size = 29 , replace = TRUE),
age = runif(n = 29 , min = 18 , max = 54 ) )
#以group和sex分组计算均值和方差
ddply(dfx, .( group , sex), summarize,
mean = round(mean(age), 2 ),
sd = round(sd(age), 2 ))
ddply(dfx, .(sex ,group), summarize,
mean = round(mean(age), 2 ),
sd = round(sd(age), 2 ))
image.png
当输入对象为list的时候 list list对象里面不存在variable这个变量
l*ply函数格式
laply(.data = ,.fun = ,...,.progress = 'none',.inform = FALSE)
ldply(.data = ,.fun = ,...,.progress = 'none',.inform = FALSE)
llply(.data = ,.fun = ,...,.progress = 'none',.inform = FALSE)
l_ply(.data = ,.fun = ,...,.progress = 'none',.inform = FALSE)
.data可以指定为列表数据,也可以指定为向量数据;
其余参数与a*ply()函数和d*lpy()函数参数一致。
例子:
x1 <- 1:100
x2 <- seq(from = 100,to = 1000 ,by = 2)
x3 <- runif(150,min = 10,max = 100)
#列表由向量构成
l1 <- list(x1 = x1,x2 = x2,x3 = x3)
llply(.data = l1,.fun = summary)
ldply(.data = l1,.fun = summary)
llply(.data = l1,.fun = quantile)
ldply(.data = l1,.fun = quantile)
image.png