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




作者:鲁伟,热爱数据,坚信数据技术和代码改变世界。R语言和Python的忠实拥趸,为成为一名未来的数据科学家而奋斗终生。个人公众号:数据科学家养成记 (微信ID:louwill12)

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

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

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

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

plyr包核心函数

    plyr16个核心函数的命名都有相应的规律,函数具体形式如 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


公众号后台回复关键字即可学习

回复 R              R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值