#--------------------------------
# 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包使用的更多相关文章

  1. R语言学习 第九篇:plyr包

    在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ...

  2. R语言学习笔记(二十四):plyr包的用法

    plyr 这个包,提供了一组规范的数据结构转换形式. Input/Output list data frame array list llply() ldply() laply() data fram ...

  3. 数据处理包plyr和dplyr包的整理

    以下内容主要参照 Introducing dplyr 和 dplyr 包自带的简介 (Introduction to dplyr), 复制了原文对应代码, 并夹杂了个人理解和观点 (多附于括号内). ...

  4. R----dplyr包介绍学习

    dplyr包:plyr包的替代者,专门面对数据框,将ddplyr转变为更易用的接口 %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以 ...

  5. R语言包_dplyr_1

    有5个基础的函数: - filter - select - arrange - mutate - summarise - group_by (plus) 可以和databases以及data tabl ...

  6. 通过 sqldf 包使用 SQL 查询数据框

    在前面的章节中,我们学习了如何编写 SQL 语句,在关系型数据库(如 SQLite 和MySQL )中查询数据.我们可能会想,有没有一种方法,能够直接使用 SQL 进行数据框查询,就像数据框是关系型数 ...

  7. R程序包

    === 数据基础操作 ===reshape2 横向.纵向做数据变换,例如把纵向堆叠在数据库中的证券行情数据转换成一个按照不同证券代码横向排列,按照时间纵向排列收盘价的数据表stringr 方便地用正则 ...

  8. R语言扩展包dplyr笔记

    引言 2014年刚到, 就在 Feedly 订阅里看到 RStudio Blog 介绍 dplyr 包已发布 (Introducing dplyr), 此包将原本 plyr 包中的 ddply() 等 ...

  9. XE2:查看Extended Events收集的数据

    SQL Server 使用Target来存储Events,Target 能够将Events存储到File中(扩展名是 xel),或 memoy buffer 中(Ring Buffer),Event ...

随机推荐

  1. 【UE4 调试】C++ 几种编译方法和小技巧

    编译方法 Visual Studio 2019 编译 默认编译 UnrealVS 快速编译 Editor 编译 一般 vs 编译完后,Editor会跟着热编译(有声音) 如果发现编译后代码没更新到Ed ...

  2. UltraSoft - Beta - Scrum Meeting 9

    Date: May 25th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录Scrum Meeting Liuzh 前端 用户忘记密码界面初稿完成 Kkk ...

  3. “妈妈再也不用担心我忘交作业了!”——记2020BUAA软工团队项目选择

    写在前面 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 团队项目选择 项目简介 项目名称:北航学生资源整合和作业提醒平台 项目内容: 设计实现一 ...

  4. 2021.7.15考试总结[NOIP模拟16]

    ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...

  5. 嵌入式单片机之stm32串口你懂了多少!!

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  6. 万维网www与HTTP协议

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105901440 学习课程:<2019王道考研计算机网络> 学习目的 ...

  7. 腾讯发布 K8s 多集群管理开源项目 Clusternet

    11月4日,在腾讯数字生态大会上,腾讯宣布了云原生领域一项重磅开源进展-- K8s 多集群管理项目 Clusternet 正式开源. Clusternet 由腾讯联合多点生活.QQ音乐.富途证券.微众 ...

  8. uni-app视频组件设置圆角

    无法实现,建议写个image在中间位置加个播放按钮,点击播放跳转新页面只需要在跳转参数里面把视频链接加上,在onLoad里面获取视频链接,自动播放视频,很多app目前都是这样做的,关闭页面后视频会自动 ...

  9. mybatis-plus查询指定字段

    show me the code :mybais-plus版本:3.1.1 1,排除某些字段,可以同时排除多个字段排除多个字段写法: .setEntity(new User()) .select(c ...

  10. 基于EPPlus和NPOI实现的Excel导入导出

    基于EPPlus和NPOI实现的Excel导入导出 CollapseNav.Net.Tool.Excel(NuGet地址) 太长不看 导入 excel 文件流将会转为 ExcelTestDto 类型的 ...