查看原文
其他

R数据处理包plyr:超越apply函数族的向量化运算

louwill 机器学习实验室 2019-04-07

    R有着强大而又丰富的数据处理能力,除了一些常用的基础数据处理函数之外,R还为我们提供了大量以实现不同的数据处理功能的扩展包。关注小编公众号的朋友应该还记得之前曾写过一篇关于R向量化运算的 apply函数族的文章:

    R语言向量化运算:apply函数族用法心得

    对于日常数据处理工作而言,可能 apply函数族的8个核心函数还不够用,所以本篇小编为大家介绍一款基于 apply函数族又超越了 apply函数族的数据处理与转换包—— plyr包。 plyr包的设计理念在于切分(split)- 处理(apply)- 整合(combine)这样的一个数据处理流程,具体来说就是先对数据进行单/多变量或者维度的分割,然后对分割后的子数据集应用目标函数进行处理,最后将各子集处理后的结果汇集起来进行返回。这样的一套数据处理流程的方便之处在于 plyr提供了16个有命名规律的核心函数,这些函数可以对各类输入数据经整合处理之后输出为指定的数据结构,简单易用方便快捷的实现数据变换和处理工作。


    需要提到的是, plyr包的作者依然是我们的 Hadley Wickham,Hadley大神除了ggplot2之外,也一直在致力于进行方便快捷的数据处理包的开发工作。

plyr包核心函数

    plyr包16个核心函数的命名都有相应的规律,函数具体形式如 XXply,第一个 X表示输入的R数据类型,第二个 X表示需要输出的R数据类型,具体 X的取值主要有:

  1. a:array

  2. d:data.frame

  3. l:list

  4. m:multiple inputs

  5. _:nothing

    比如说 adply就表示输入为数组结构输出为数据框形式, dlply就表示输入为数据框形式输出为列表形式,诸如此类。 plyr包16个核心函数如下:

  1. aaply    

  2. adply    

  3. alply    

  4. a_ply

  5. daply    

  6. ddply    

  7. dlply    

  8. d_ply

  9. laply    

  10. ldply    

  11. llply    

  12. l_ply

  13. maply  

  14. mdply  

  15. mlply  

  16. m_ply

    至于这些函数的具体用法,其实也是有规律可循的,以 ddply函数的用法为例:

  1. ddply(.data, .variables, .fun = NULL, ..., .progress = "none",

  2.  .inform = FALSE, .drop = TRUE, .parallel = FALSE, .paropts = NULL)

    其中 .data自然是待处理的输入数据,在 ddply函数里指的是 data frame.variables指的是用来对数据框进行分割的参数,可以是数据变量、式子或者一个字符串向量; .fun就是应用在各个划分后的子数据集上的函数,核心参数就这三个,其他参数均是可选的,具体不在此一一释义。

plyr数据处理实例

    下面小编以 aaplydlplyddply三个核心函数为例,展示一下 plyr包在数据处理方面的强大功能。

  1. #aaply

  2. library(plyr)

  3. #求数据在1维上的均值

  4. aaply(ozone, 1, mean)

  5. -21.2    -18.7    -16.2    -13.7    -11.2     -8.7     -6.2     -3.7     -1.2

  6. 266.8194 263.0104 260.6493 258.8148 257.8657 256.9306 256.1007 255.6238 255.5081

  7.     1.3      3.8      6.3      8.7     11.2     13.7     16.2     18.7     21.2

  8. 255.0718 254.1771 254.5139 256.0729 258.8160 261.3009 263.7072 266.4005 269.9294

  9.    23.7     26.2     28.7     31.2     33.7     36.2

  10. 273.9062 279.5926 285.3356 293.2234 300.2546 308.7153

  11. #.drop参数控制输出形式的数据相较于输入数据是否降维

  12. dim(aaply(ozone, c(1,2), mean))

  13. [1] 24 24

  14. dim(aaply(ozone, c(1,2), mean, .drop = FALSE))

  15. [1] 24 24 1

    再来看 ddply函数的使用:

  1. #ddply

  2. #创建一个数据框

  3. dfx <- data.frame(

  4.  group = c(rep('A', 8), rep('B', 15), rep('C', 6)),

  5.  sex = sample(c("M", "F"), size = 29, replace = TRUE),

  6.  age = runif(n = 29, min = 18, max = 54)

  7. )

  8. #以group和sex分组计算均值和方差

  9. ddply(dfx, .(group, sex), summarize,

  10.      mean = round(mean(age), 2),

  11.      sd = round(sd(age), 2))

  12. group sex  mean    sd

  13. 1     A   F 43.35  8.29

  14. 2     A   M 38.49  8.64

  15. 3     B   F 34.89 12.14

  16. 4     B   M 43.65 10.25

  17. 5     C   F 45.68    NA

  18. 6     C   M 41.16  9.13

    最后看一个 dlply函数的例子:

  1. #自定义一个回归函数

  2. linmod <- function(df) {

  3.  lm(rbi ~ year, data = mutate(df, year = year - min(year)))

  4. }

  5. #使用dlply函数以.id变量进行切分对baseball数据集进行分组回归处理

  6. models <- dlply(baseball, .(id), linmod)

  7. models[[1]]

  8. Call:

  9. lm(formula = rbi ~ year, data = mutate(df, year = year - min(year)))

  10. Coefficients:

  11. (Intercept)         year  

  12.    118.924       -1.732

  13. #后续还可以利用上述结果做一些可视化展示

  14. coef <- ldply(models, coef)

  15. with(coef, plot(`(Intercept)`, year))

  1. qual <- laply(models, function(mod) summary(mod)$r.squared)

  2. hist(qual)


参考资料:

http://127.0.0.1:31469/library/plyr/html/00Index.html



往期精彩:

从numpy开启Python数据科学之旅

gganimate:构建R语言可视化gif动图

使用jupyter notebook搭建数据科学最佳交互式环境

R编程特性1:向量与向量化

R Markdown|可能是你数据分析报告最好的解决方案

如何写出整洁规范的R代码?是时候讨论一下代码规范性了

Python面向对象编程:数据封装、继承和多态

[译]为什么R语言是当今最值得学习的数据科学语言






一个数据科学热爱者的学习历程

长按二维码.关注数据科学家养成记



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存