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

浏览: 1937

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

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

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

image.png

  需要提到的是, 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))

image.png

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

image.png

参考资料:

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

image.png

推荐 0
本文由 鲁伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册