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 ...
随机推荐
- HCNP Routing&Switching之BGP防环机制和路由聚合
前文我们了解了BGP路由宣告相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15440860.html:今天我们来聊一聊BGP防环机制和路由聚合相关话题 ...
- 我们一起来回顾一下Synchronized关键字吧
多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...
- k8s replicaset controller 分析(3)-expectations 机制分析
replicaset controller分析 replicaset controller简介 replicaset controller是kube-controller-manager组件中众多控制 ...
- $dy$讲课总结
字符串: 1.广义后缀自动机(大小为\(m\))上跑一个长度为\(n\)的串,所有匹配位置及在\(parent\)树上其祖先的数量的和为\(min(n^2,m)\),单次最劣是\(O(m)\). 但是 ...
- NorFlash、NandFlash在技术和应用上有些什么区别?
首先你要搞懂什么是Flash Memory? Flash Memory(快闪存储器),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器.这种科技主要用于一般性数据存储,以及在 ...
- 华为HG255D挂卡中继专用旋风科技固件
正的挂卡不掉线不掉速,稳定上网看上去好像很NB的样子 挂卡设置教程:http://picimg.lshou.com/pic/clou ... /6/t/1/30247515.mp4 固件链接: htt ...
- 疯狂Java基础Day1
--每过一遍基础,都是一次提升! 太多遗忘了,慢慢补... 推一个Java学习教程--->b站搜:狂神说Java系列(排序完毕) 推荐原因:讲的不错,会涉及到底层,也会讲讲面试. 一.注释 主要 ...
- 从零开始 DIY 智能家居 - 智能开窗器
前言 做完智慧浇水器之后对这种可以节省时间和精力的场景总有一种谜之向往(懒鬼是这样的),这次我准备做一个可以自动开窗的装置,结合之前的甲醛检测传感器就可以实现甲醛含量过高自动开窗通风,之后还可以把燃气 ...
- python文件读写及修改
转载:https://www.cnblogs.com/zhxwind/p/8761618.html 文件的读写有三种形式:读.写和追加. 一.读模式 r 和读写模式 r+ 1.读模式 r 读模式r特点 ...
- SpirngBoot整合Mybatis Plus多数据源
导读 有一个这样子的需求,线上正在跑的业务,由于业务发展需要,需重新开发一套新系统,等新系统开发完成后,需要无缝对接切换,当初具体设计见草图. 添加依赖 <!--lombok--> < ...