plyr包使用
#--------------------------------
# plyr包使用
# 建议直接保存为R文件到Rstudio中运行
#-------------------------------- #-------------1.传统apply函数与plyr比较
library(tidyr)
library(plyr)
head(iris)
long.iris <- stack(iris, select=-Species)#stack宽数据库转换长数据,unstack相反
long.iris <- data.frame(
long.iris,
Species=rep(
iris[['Species']], 4
)
)
colnames(long.iris)
#不同物种的不同属性的最大和最小值,使用tapply函数结果是list
tapply(
long.iris$values,
INDEX=paste(
long.iris$Species,
long.iris$ind,
sep='.'
),
function(x) {c(max(x), min(x))}
) #使用 plyr 包中的 ddply 得到数据框格式
ddply(
long.iris,
.(Species, ind),
function(x) {c(max(x$values), min(x$values))}
) #--------2.plyr中的apply函数组合
#输入结构有array(a),list(l),data.frame(d)三种,输出结构有a,l,d,-(空,即不输出)四种,共12种组合函数 #------a*ply: aaply,adply,alply,a_ply
#a*ply(.data, .margins, .fun, ..., .progress='none')
#.data数组,.margins向量形式(包含要考虑的维度,即行维和列维),.fun为行或列维指定需要处理的函数,.progress显示进度条的方式
a <- array(rnorm(27), c(3, 3, 3));a
adply(a, c(1, 2), mean)
#三维数组需要对前两维进行计算,.fun 则需根据所输入的数组和选用的 margin 进行匹配。
aaply(a, c(1), class)
aaply(a, c(1, 2), class)
#选择其中一个维度进行分组, .fun 则应该是对二维数组, 即矩阵的操作。 a <- array(data = 1:500,dim = c(100,5));a
#对每一行求均值
test1 <- aaply(.data = a,.margins = 1,.fun = mean,.progress = "none")
test1
# 对每一行求标准差,以文本的形式显示进度条
test2 <- adply(.data = a,.margins = 1,.fun = sd,.progress = "text")
test2 #------d*ply: daply,ddply,dlply,d_ply
#d*ply(.data, .variables, .fun, ..., .progress='none')
#.data数据框,.variables向量形式(包含要考虑的列名,即分组变量),.fun基于分组变量对数据框中的其余变量指定某种函数
daply(
long.iris,
c('Species', 'ind'),
function(x) {c(max(x$values), min(x$values))}
) #对于ddply函数,.fun 所接受的函数是和输入数据表同样的列数而不同行数的数据表进行操作的函数
dim(long.iris) #三列600行
ddply(
long.iris,
.(Species, ind),
function(x) {c(class(x), dim(x))}
)
50 * 12 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) #------l*ply:laply,ldply,llply,l_ply
#l*ply(.data, .fun, ..., .progress='none')
llply(long.iris, unique) # 向量列表
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);l1
laply(.data = l1,.fun = mean)
ldply(.data = l1,.fun = summary)
llply(.data = l1,.fun = quantile)
l_ply(.data = l1,.fun = summary) #数据框列表
y11 <- rnorm(n = 100,mean = 10,sd = 5)
y12 <- rt(n = 100,df = 3)
y13 <- rf(n = 100,df1 = 2,df2 = 3)
y14 <- factor(x = c("low","potential","high"),ordered = T)
y15 <- sample(y14,size = 100,replace = TRUE)
d11 <- data.frame(y1 = y11,y2 = y12,y3 = y13,y5 = y15)
head(d11) y21 <- 1:100
y22 <- seq(from = 1,to = 2,length = 100)
y23 <- rchisq(n = 100,df = 8)
y24 <- factor(x = c("A","B","C","D"),order = T)
y25 <- sample(y24,size = 100,replace = TRUE)
d21 <- data.frame(y21 = y21,y22 = y22,y23 = y23,y25 = y25)
head(d21) l2 <- list(first = d11,second = d21);str(l2)
library(psych)
fun <- function(data) describeBy(data[,1:3],group = data[,4])#分组统计
llply(.data = l2,.fun = fun,.progress = "none")
llply(.data = l2,.fun = fun,.progress = "text") #-------m*ply: maply,mdply,mlply,m_ply
#m*ply(.data, .fun, ..., .progress='none') m表矩阵或数据框 b <- data.frame(
n=c(5, 5, 5),
mean=c(1, 20, 300),
sd=c(1, 20, 300)
);b mdply(b, rnorm) #------------总结
#对于 a*ply, d*ply, 和 l*ply 函数重要的区别在于如何确定分组:
#a*ply 函数是根据 .margins 指定的输入数组的维度的值进行分组计算,
#d*ply 函数是根据 .variables 指定的列名进行分组计算,
#l*ply 函数类似于 lapply 对列表的每一个元素进行计算。 Ref:
https://zhuanlan.zhihu.com/p/29252477
https://www.cnblogs.com/awishfullyway/p/6485250.html
plyr包使用的更多相关文章
- R语言学习 第九篇:plyr包
在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ...
- R语言学习笔记(二十四):plyr包的用法
plyr 这个包,提供了一组规范的数据结构转换形式. Input/Output list data frame array list llply() ldply() laply() data fram ...
- 数据处理包plyr和dplyr包的整理
以下内容主要参照 Introducing dplyr 和 dplyr 包自带的简介 (Introduction to dplyr), 复制了原文对应代码, 并夹杂了个人理解和观点 (多附于括号内). ...
- R----dplyr包介绍学习
dplyr包:plyr包的替代者,专门面对数据框,将ddplyr转变为更易用的接口 %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以 ...
- R语言包_dplyr_1
有5个基础的函数: - filter - select - arrange - mutate - summarise - group_by (plus) 可以和databases以及data tabl ...
- 通过 sqldf 包使用 SQL 查询数据框
在前面的章节中,我们学习了如何编写 SQL 语句,在关系型数据库(如 SQLite 和MySQL )中查询数据.我们可能会想,有没有一种方法,能够直接使用 SQL 进行数据框查询,就像数据框是关系型数 ...
- R程序包
=== 数据基础操作 ===reshape2 横向.纵向做数据变换,例如把纵向堆叠在数据库中的证券行情数据转换成一个按照不同证券代码横向排列,按照时间纵向排列收盘价的数据表stringr 方便地用正则 ...
- R语言扩展包dplyr笔记
引言 2014年刚到, 就在 Feedly 订阅里看到 RStudio Blog 介绍 dplyr 包已发布 (Introducing dplyr), 此包将原本 plyr 包中的 ddply() 等 ...
- XE2:查看Extended Events收集的数据
SQL Server 使用Target来存储Events,Target 能够将Events存储到File中(扩展名是 xel),或 memoy buffer 中(Ring Buffer),Event ...
随机推荐
- 【UE4 设计模式】组件模式 Components Pattern
概述 描述 在单一实体跨越了多个领域时,为了保持领域之间相互解耦,可以将每部分代码放入各自的组件类中,将实体简化为组件的容器. 套路 参考 UE4中的 Componet 组件使用方式 使用场景 有一个 ...
- 【UE4 设计模式】观察者模式 Observer Pattern
概述 描述 定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做 发布-订阅(Publish/Subscribe)模式 模型-视图(M ...
- Shiro反序列化的检测与利用
1. 前言 Shiro 是 Apache 旗下的一个用于权限管理的开源框架,提供开箱即用的身份验证.授权.密码套件和会话管理等功能. 2. 环境搭建 环境搭建vulhub 3. 如何发现 第一种情况 ...
- 四万字32图,Kafka知识体系保姆级教程宝典
本文目录: 一.消息队列 Apache Pulsar Pulsar 与 Kafka 对比 二.Kafka基础 三.Kafka架构及组件 四.Kafka集群操作 五.Kafka的JavaAPI操作 六. ...
- Noip模拟36 2021.8.11
刚题的习惯还是改不了,怎么办??? T1 Dove打扑克 考场上打的动态开点线段树+并查集,考后发现自己像一个傻子,并查集就行.. 这几天恶补数据结构疯了 用树状数组维护后缀和,$siz_i$表示编号 ...
- SVN查看项目修改记录及修改内容
工具/原料 svn 一,查看修改记录 1 选择要查看的文件夹,打开之后在空白的地方右键. 2 选择svn里面的"查看日志".show_Log 3 在弹出的日志框里,可以看到,你可以 ...
- 转:VIVADO使用技巧:设置DCI与内部参考电压
本文转自:Vivado使用技巧(12):设置DCI与内部参考电压 - 灰信网(软件开发博客聚合) (freesion.com) DCI与内部参考电压 Xilinx FPGA提供了DCI(Digital ...
- zabbix 报警发送qq邮件
1.开启QQ邮箱的IMAP/SMTP服务,获取授权码 获取授权码:点击[开启]按钮,编辑短信发送,即可获得授权码 2.配置 /etc/mail.rc 添加下列配置: [ set from=XXX@qq ...
- Tomcat 内存马(二)Filter型
一.Tomcat处理请求 在前一个章节讲到,tomcat在处理请求时候,首先会经过连接器Coyote把request对象转换成ServletRequest后,传递给Catalina进行处理. 在Cat ...
- Window黑客编程之资源释放技术
前言 今天说一下写病毒木马会广泛使用的一种技术--资源释放技术.为什么我们在写木马时会使用到资源释放技术呢?这是因为它可以使我们写的程序变得简洁.如果程序需要额外加载一些DLL文件或者文本文件,我们可 ...