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 ...
随机推荐
- 【c++ Prime 学习笔记】目录索引
第1章 开始 第Ⅰ部分 C++基础 第2章 变量和基本类型 第3章 字符串.向量和数组 第4章 表达式 第5章 语句 第6章 函数 第7章 类 第 Ⅱ 部分 C++标准库 第8章 IO库 第9章 顺序 ...
- Java:LinkedList类小记
Java:LinkedList类小记 对 Java 中的 LinkedList类,做一个微不足道的小小小小记 概述 java.util.LinkedList 集合数据存储的结构是循环双向链表结构.方便 ...
- [Beta]the Agiles Scrum Meeting 9
会议时间:2020.5.24 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 撰写技术博客 tq 实现评测机获取评测状态功能 评测部分增加更多评测指标 wjx ...
- BUAA_2020_软件工程_个人博客作业
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 了解软件工程的技术,掌握工程化开发的能力 这个作业在哪个具体方 ...
- ssh后门反向代理实现内网穿透
如图所示,内网主机ginger 无公网IP地址,防火墙只允许ginger连接blackbox.example.com主机 假如你是ginger的管理员root,你想要用tech主机连接ginger主机 ...
- f(sinx)到底是啥
总结一句:cosx是偶次就一定可以用.
- 洛谷 P5657 [CSP-S2019] 格雷码
链接: P5657 分析: 签到题,不过也有不少细节. 数据范围需要开 unsigned long long ,前年也有很多人因此丢了5分. pow 会出现神必错误,需要手写一个 mpow 函数. 算 ...
- 算法:汉诺塔问题(Tower of Brahma puzzle)
一.算法背景 最早发明这个问题的人是法国数学家爱德华·卢卡斯.传说越南河内某间寺院有三根银棒(A, B, C),上串 64 个金盘. 寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这 ...
- [转]DDR3基础知识介绍
本文转自:(4条消息) xilinx ddr3 MIG ip核使用详解_admiraion123的博客-CSDN博客 1,DDR3基本内容介绍1.1,DDR3简介DDR3全称double-data-r ...
- JAVA笔记__窗体类/Panel类/Toolkit类
/** * 窗体类 */ public class Main { public static void main(String[] args) { MyFrame m1 = new MyFrame() ...