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 ...
随机推荐
- [软工顶级理解组] Beta阶段项目展示
目录 团队成员 软件介绍 项目简介 预期典型用户 功能描述 预期目标用户数 用户反馈 团队管理 分工协作 项目管理 取舍平衡 代码管理 程序测试 代码规范 文档撰写 继续开发指导性 用户沟通 需求分析 ...
- 2021.10.27考试总结[冲刺NOIP模拟17]
T1 宝藏 发现每个数成为中位数的长度是关于权值单调的.线段树二分判断是否合法,单调指针扫即可. 考场上写了二分,平添\(\log\). \(code:\) T1 #include<bits/s ...
- hdu 1848 Fibonacci again and again (SG)
题意: 3堆石头,个数分别是m,n,p. 两个轮流走,每走一步可以选择任意一堆石子,然后取走f个.f只能是菲波那契中的数(即1,2,3,5,8.....) 取光所有石子的人胜. 判断先手胜还是后手胜. ...
- linux 内核源代码情景分析——Intel X86 CPU 系列的寻址方式
当我们说一个CPU是"16位"或"32"位时,指的是处理器中"算数逻辑单元"(ALU)的宽度.数据总线通常与ALU具有相同的宽度.当Inte ...
- Python技法4:闭包
闭包:用函数代替类 有时我们会定义只有一个方法(除了__init__()之外)的类,而这种类可以通过使用闭包(closure)来替代.闭包是被外层函数包围的内层函数,它能够获取外层函数范围中的变量(即 ...
- 『动善时』JMeter基础 — 57、Linux系统中运行JMeter脚本
目录 1.Linux系统中安装Java环境 (1)解压Java安装包 (2)配置Java环境变量 (3)验证Java环境是否配置成功 2.Linux系统中安装JMeter (1)下载JMeter (2 ...
- 03 | 变量的解构赋值 | es6
变量的解构赋值 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a ...
- coding game, 边打游戏边学编程,是一种怎么样的体验?
前言 hello,大家好,我是bigsai,好久不见,甚是想念! 在日常生活中,很多人喜欢玩游戏,因为游戏中有着对抗博弈.控制的喜悦,用灵魂指法完成一波靓丽的操作. 但实际上,你的按键都是对应代码中一 ...
- C# WINFORM进销存系统开发(内涵免费源码+部分实操视频讲解)
互联网的时代,电商火爆,大家都开始进行线上销售货品,那你是如何管理你的商品库存和进销问题?软积木--小敏用的是C# WINFORM进销存系统来管理我的数据,给我带来了很多便利. 它是高频需求项目,很多 ...
- 大一C语言学习笔记(2)---快捷键篇
大家好,博主呢,是一位刚刚步入大一的软件工程专业的大学生,之所以写博客,是想要与同样刚刚接触程序员一行的朋友们一起讨论,进步,在这里记录我的一些学习笔记及心得,希望通过这些点点滴滴的努力,可以让我们离 ...