楼主: kk22boy
12385 13

[程序分享] 用plyr包扩展apply族函数的功能 [推广有奖]

  • 8关注
  • 95粉丝

一叶知秋

学科带头人

51%

还不是VIP/贵宾

-

TA的文库  其他...

计量经济与统计

SSCI、权威 论文写作及投稿经验

威望
1
论坛币
56594 个
通用积分
128.9629
学术水平
437 点
热心指数
492 点
信用等级
393 点
经验
67522 点
帖子
1589
精华
0
在线时间
2188 小时
注册时间
2005-3-10
最后登录
2024-4-2

初级热心勋章 初级信用勋章

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
apply族函数是R语言中很有特色的一类函数,包括了apply、sapply、lapply、tapply、aggregate等等。在这篇博文里对它们进行了简略的说明。这一类函数本质上是将数据进行分割、计算和整合。它们在数据分析的各个阶段都有很好的用处。例如在数据准备阶段,我们可以按某个标准将数据分组,然后获得各组的统计描述。或是在建模阶段,为不同组的数据建立模型并比较建模结果。apply族函数与Google提出的mapreduce策略有着一致的思路。因为mapreduce的思路也是将数据进行分割、计算和整合。只不过它是将分割后的数据分发给多个处理核心进行运算。如果你熟悉了apply族函数,那么将数据转为并行运算是轻而易举的事情。plyr包则可看作是apply族函数的扩展,使之更容易运用,功能更为强大。

plyr包的主函数是**ply形式的,其中首字母可以是(d、l、a),第二个字母可以是(d、l、a、_),不同的字母表示不同的数据格式,d表示数据框格式,l表示列表,a表示数组,_则表示没有输出。第一个字母表示输入的待处理的数据格式,第二个字母表示输出的数据格式。例如ddply函数,即表示输入一个数据框,输出也是一个数据框。


下面首先来用一个简单的例子说明一下用法。还是用iris数据集,其中包括了一个分类变量和四个数值变量。我们希望数据按不同类别,分别计算数值变量的均值。下面我们分别用三种方法来得到同样的结果。

library(plyr)
library(reshape2)
# 用aggregate函数进行数据汇总
aggregate(iris[1:4],list(iris$Species),mean)
# 用reshape2包进行数据汇总
data.melt <- melt(iris,id=c('Species'))
dcast(data.melt,Species~variable,mean)
# 用ddply函数进行数据汇总
ddply(iris,.(Species),function(df) mean(df[1:4]))
初看起来plyr包所具备的功能并不很出彩,下面我们看一个略为复杂例子。还是用iris数据,我们希望对每一种花做一个简单回归。

# 首先定义回归函数
model <- function(x) {
    lm(Petal.Length~Petal.Width,data=x)
}
# 如果用普通的函数则需要如下的分割、计算、整合三个步骤共四条命令
pieces <- split(iris,list(iris$Species))
models <- lapply(pieces,model)
result <- lapply(models,coef)
do.call('rbind',result)
# 用plyr包只用下面两个函数,每个函数都内置了分割、计算、整合的功能。
result1 <- dlply(iris,.(Species),model)
result2 <- ldply(result1,function(x) coef(x))
plyr包中还有两个比较特别的函数,分别是r*ply和m*ply,它们分别对应的是replicate和mapply函数。

replicate(20,mean(runif(100)))
rdply(20, mean(runif(100)))
mapply(rnorm,mean=1:5,sd=1:5, n=2)
mdply(data.frame(mean = 1:5, sd = 1:5), rnorm, n = 2)
最后我们来看一个mdply函数的应用,我们希望用神经网络包来为不同的花进行分类,使用BP神经网络需要的一个参数就是隐藏层神经元的个数。我们来尝试用1到10这十个参数运行模型十次,并观察十个建模结果的预测准确率。但我们并不需要手动运行十次。而是使用mdply函数来完成这个任务。

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)By 写长城的诗
参考资料:
http://plyr.had.co.nz/09-user/
http://www.jstatsoft.org/v40/i01/paper

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:apply appl App Aggregate MapReduce Google 模型 特色 统计

已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
李会超 + 60 + 40 精彩帖子
ltx5151 + 20 根据规定进行奖励
epoh + 5 + 5 + 5 奖励积极上传好的资料

总评分: 经验 + 80  论坛币 + 40  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

本帖被以下文库推荐

如果该贴对您有些许帮助,希望你能回复一下或者评一下热心指数!谢谢!
沙发
fechy 发表于 2013-7-4 15:18:01 |只看作者 |坛友微信交流群
很好,很强大!

使用道具

藤椅
dybwall1234 发表于 2013-10-11 15:48:52 |只看作者 |坛友微信交流群
不错,学习了

使用道具

板凳
feasible 发表于 2013-10-14 22:10:37 |只看作者 |坛友微信交流群
不错,收藏!!!

使用道具

报纸
nieqiang110 学生认证  发表于 2013-10-15 21:16:01 |只看作者 |坛友微信交流群
谢谢分享

使用道具

地板
jiabiao1602 发表于 2013-11-6 09:11:05 |只看作者 |坛友微信交流群
很好很强大 受教了

使用道具

7
jgchen1966 发表于 2013-11-9 23:24:14 |只看作者 |坛友微信交流群
小数据集,少模型,用plyr 中函数,进行参数TUNING 似方便,但大数据,问题会较多,不如用for ,while 等直接 循环,R 中 有很多用plyr的综合的data mining 的综合包:mlr ,caret ,rminer ,CMA 、、等,但运行速度明显慢于本人自编的简单循环的每步处理的方法。。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
complicated + 3 + 3 + 3 + 3 caret确实慢,现在动辄上G的数据量下,小而.

总评分: 论坛币 + 3  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

鹑居鷇食,鸟行无彰

使用道具

8
fly717 学生认证  发表于 2015-1-27 22:49:58 |只看作者 |坛友微信交流群
楼上高手……

使用道具

9
fly717 学生认证  发表于 2015-1-27 23:02:00 |只看作者 |坛友微信交流群
ddply(iris,.(Species),function(df) mean(df[1:4]))这行命令返回下列信息:
Warning messages:
1: In mean.default(df[1:4]) :
  argument is not numeric or logical: returning NA
2: In mean.default(df[1:4]) :
  argument is not numeric or logical: returning NA
3: In mean.default(df[1:4]) :
  argument is not numeric or logical: returning NA
楼主,请问命令是否有错误啊,貌似不能mean(df[1:4])这样求各列均值,正确的应该是什么呢?

使用道具

10
ウ兴ウ 发表于 2015-5-14 16:18:00 |只看作者 |坛友微信交流群
学习了

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-5 14:36