R实战 第六篇:数据变换(aggregate+dplyr)
数据分析的工作,80%的时间耗费在处理数据上,而数据处理的主要过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,首先,把数据根据特定的字段分组,每个分组都是独立的;然后,对每个分组按照业务需求执行转换;最后,把转换后的结果组合在一起。在数据处理中,经常需要循环访问数据,R语言是矢量化的,天生具有处理循环操作的优势。
使用ggplot2包中的diamonds数据集做为示例数据
- > install.packages('ggplot2')
- > library(ggplot2)
- > data("diamonds")
data()函数的作用是加载指定的数据集,本例将加载ggplot2包中的diamonds数据集,这个数据集在下文直接引用。
一,使用aggregate()函数做数据变换
在研究数据时,有时需要对数据按照特定的字段进行分组,然后统计各个分组的数据,这就是SQL语法中的分组-聚合操作,使用aggregate()函数对数据进行简单的数据处理。
aggregate()函数用于把数据分离为单独的子集,为每一个子集计算聚合值,然后把聚合值结合(combine)在一起返回。
- aggregate(formula, data, FUN, ...,subset, na.action = na.omit)
参数注释:
- formula:指定formula对象,包括符号“ ~”,以及在符号“~”两侧的变量,左侧代表要计算聚合值的变量(聚合变量),右侧代表分组的变量,例如,price~cut,函数依据分组变量,把数据分离为多个单独的子集。
- data:指定操作的数据框;
- FUN:该参数用于指定函数,该函数应用在符号“~”左侧的变量;
- ...:指定传递给FUN函数的其他参数;
- subset:向量类型,可选参数,用于指定data的观测子集;
- na.action: 如何处理缺失值,默认为忽略NA。如果不选择na.omit,则需指定函数去处理NA。
1,单个分组变量
使用aggregate() 函数操作diamonds数据集,按照cut字段分组,函数mean的作用是为每个分组计算prince的平均值:
- aggregate(price~cut,diamonds,mean)
2,多个分组变量
aggregate()函数能够添加多个分组变量,只需要在formula右侧添加变量,并用加号“+”隔离:
- > aggregate(price~cut+color,diamonds,mean)
- cut color price
- Fair D 4291.061
- Good D 3405.382
- Very Good D 3470.467
- ....
3,多个聚合变量
aggregate()函数能够添加多个聚合变量,只需要在formula左侧,使用函数cbind()把两个变量组合起来:
- > aggregate(cbind(price,carat)~cut,diamonds,mean)
- cut price carat
- Fair 4358.758 1.0461366
- Good 3928.864 0.8491847
- Very Good 3981.760 0.8063814
- Premium 4584.258 0.8919549
- Ideal 3457.542 0.7028370
4,多个分组变量和多个聚合变量
aggregate()函数能够formular对象的两侧分别添加多个变量,按照多个分组变量和多个聚合变量执行聚合运算
- > aggregate(cbind(price,carat)~cut+color,diamonds,mean)
- cut color price carat
- Fair D 4291.061 0.9201227
- Good D 3405.382 0.7445166
- ....
二,计数
R中计数比较特殊,plyr包中有一个计算函数count(),参数vars定义分组的变量,该函数会把重复值计算N次:
- count(df, vars = NULL)
使用aggregate()来实现分组计数,使用length(x)来计算向量中元素的个数,该函数会把重复值计算N次:
- aggregate(cut~color,diamonds,length)
为了计算唯一值的数量,可以使用unique(x),在计数之前,对向量元素去重:
- aggregate(cut~color,diamonds,function(x) length(unique(x)))
三,数据变换(dplyr包)
dplyr包提供灵活的数据操作,用于对数据框执行转化和重塑,这个包是plyr包的升级版本,侧重于处理数据框对象,因此其名字带d(data frame),dplyr包是R开发人员必学必会的包。
dplyr包有三个主要的目标:
- 更加灵活和简单地处理数据框;
- 使用内存,提高数据处理的性能;
- 使用相同的接口处理数据,无论数据存储在何处,无论是在数据框中,数据表或数据库。
- install.packages("dplyr")
- library(dplyr)
dplyr
包只能用于tibble(简称tbl)类型的对象,tibble 类型是dplyr包特有的对象类型(data frame tbl / tbl_df)。在利用dplyr
包处理数据之前,建议把数据框装载成tibble类型,可以调用 tbl_df()
函数把数据框类型转化成 tibble 类型的数据对象:
- > df <- tbl_df(diamonds)
2,投影函数(select)
从tbl对象中,选择特定的数据列显示,select()函数的第一个参数是tibble对象,后续的参数是tbl对象中的变量名:
- > select(df,carat,cut,color)
2,筛选函数(filter)
从tbl对象中,按照特定的条件过滤数据:
- > filter(df,color=='E')
3,转换函数(mutate)
根据tbl对象中的数据,应用指定的公式,派生新的数据列,或重写已经存在的数据列:
- > mutate(df,avg_ct=price/carat)
4,汇总函数(summarize)
对tbl对象执行聚合运算,如果tbl对象已经被分组,那么单独对每个分组进行聚合运算:
- > summarize(df,avg_prince=mean(price),avg_ct=mean(carat))
5,分组函数(group_by)和移除分组(ungroup)
使用group_by()函数对tbl对象执行分组,被分组之后,tbl对象处于分组状态,可以使用ungroup函数,移除tbl对象的分组状态。
- group_by(df,color)
6,排序函数(arrange)
arrange()函数对tbl变量进行排序,默认是按照字段的升序值排序,使用desc(field),可以按照字段的降序值排序:
- > arrange(df,color)
7,管道操作符(%>%)
管道操作符(%>%)用于把前一步操作的结果集(变量类型是tbl)传递到给函数的第一个参数中,同时函数的第一个参数可以省略,例如:
- > df %>% group_by(color) %>% summarize(mean(price))
- # A tibble: x
- color `mean(price)`
- <ord> <dbl>
- D 3169.954
- E 3076.752
- F 3724.886
- G 3999.136
- H 4486.669
- I 5091.875
- J 5323.818
8,连接操作(join)
dplyr包还提供了连接(join)操作,
- inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
- left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
- right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
- full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
- semi_join(x, y, by = NULL, copy = FALSE, ...)
- anti_join(x, y, by = NULL, copy = FALSE, ...)
参数注释:
- by:设置两个数据集用于匹配的字段名,默认使用全部的同名字段进行匹配,如果两个数据集需要匹配的字段名不同,可以直接用等号指定匹配的字段名,例如, by = c("a" = "b"),表示用x.a和y.b进行匹配。
- copy:如果两个数据集来自不同的数据源,copy设置为TRUE时,会把数据集y的数据复制到数据集x中,出于性能上的考虑,需要谨慎设置copy参数为TRUE。
- suffix:合并后的数据集中同名变量,会自动添加suffix中设置的后缀加以区分。
9,集合操作(set)
- #取两个集合的交集
- intersect(x,y, ...)
- #取两个集合的并集,并进行去重
- union(x,y, ...)
- #取两个集合的并集,不去重
- union_all(x,y, ...)
- #取两个集合的差集
- setdiff(x,y, ...)
- #判断两个集合是否相等
- setequal(x, y, ...)
10,绑定操作
dplyr包提供了按行/列合并数据集的函数,合并的对象为数据框,也可以是能够转换为数据框的列表。按行合并函数bind_rows()通过列名进行匹配,不匹配的值使用NA替代,类似于base:: rbind()函数。按列合并函数bind_cols()通过行号匹配,因此合并的数据框必须有相同的行数,函数类似于base:: cbind()函数。原数据集行名称会被过滤掉。
- #按行合并,.id添加新列用于指明合并后每条数据来自的源数据框
- bind_rows(...,.id = NULL)
- #按列合并
- bind_cols(...)
- #合并数据集
- combine(...)
11,排名操作
- row_number(x)
- ntile(x, n)
- min_rank(x)
- dense_rank(x)
- percent_rank(x)
- cume_dist(x)
例如,对一个向量的元素进行排序:
- x <- c(, , , , , NA)
- row_number(x)
12,去重
对数据对象去重
- distinct(data, ..., keep_all = FALSE)
参数注释:
- data:tbl对象
- ... :可选的变量,用于指定去重的变量,如果去重的变量不唯一,那么只保留第一个观测
- keep_all:设置为TRUE时,所有的变量都保留到.data,如果...的组合不唯一,那么只保留第一行的观测的各个变量值
13,计数
计数使用函数 n() 来实现,而统计数据集中无重复值的数量使用函数 n_distinct()来实现:
- n()
- n_distinct(..., na.rm = FALSE)
统计各个分组的观测数量,只能用于 summarise(), mutate() 和 filter() 中
- carriers <- group_by(flights, carrier)
- summarise(carriers, n())
- mutate(carriers, n = n())
- filter(carriers, n() < )
参考文档:
R语言滴水穿石系列文章(一):dplyr-高效的数据变换与整理工具
R实战 第六篇:数据变换(aggregate+dplyr)的更多相关文章
- R实战 第三篇:数据处理(基础)
数据结构用于存储数据,不同的数据结构对应不同的操作方法,对应不同的分析目的,应选择合适的数据结构.在处理数据时,为了便于检查数据对象,可以通过函数attributes(x)来查看数据对象的属性,str ...
- [Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权
一. 前言 本篇实战案例基于 youlai-mall 项目.项目使用的是当前主流和最新版本的技术和解决方案,自己不会太多华丽的言辞去描述,只希望能勾起大家对编程的一点喜欢.所以有兴趣的朋友可以进入 g ...
- R实战 第八篇:重塑数据(reshape2)
数据重塑通常使用reshape2包,reshape2包用于实现对宽数据及长数据之间的相互转换,由于reshape2包不在R的默认安装包列表中,在第一次使用之前,需要安装和引用: install.pac ...
- R实战 第五篇:绘图(ggplot2)
ggplot2包实现了基于语法的.连贯一致的创建图形的系统,由于ggplot2是基于语法创建图形的,这意味着,它由多个小组件构成,通过底层组件可以构造前所未有的图形.ggplot2可以把绘图拆分成多个 ...
- R实战 第三篇:数据处理
在实际分析数据之前,必须对数据进行清理和转化,使数据符合相应的格式,提高数据的质量.数据处理通常包括增加新的变量.处理缺失值.类型转换.数据排序.数据集的合并和获取子集等. 一,增加新的变量 通常需要 ...
- MyCat 学习笔记 第六篇.数据分片 之 按月数据分片
1 应用场景 Mycat 有很多数据分库规则,接下来几篇就相关觉得常用的规则进行试用与总结. 一般来说,按自然月份来进行数据分片的规则比较适用于商城订单查询,类似最近1周.2周.3个月内的数据.或是报 ...
- R实战 第七篇:绘图文本表
文本表是显示数据的重要图形,一个文本表按照区域划分为:列标题,行标题,数据区,美学特征有:前景样式.背景央视.字体.网格线等. 一,使用ggtexttable绘图文本表 载入ggpubr包,可以使用g ...
- R实战 第十一篇:处理缺失值
在真实的世界中,缺失数据是经常出现的,并可能对分析的结果造成影响.在R中,经常使用VIM(Visualization and Imputation of Missing values)包来对缺失值进行 ...
- R绘图 第六篇:绘制线图(ggplot2)
线图是由折线构成的图形,线图是把散点从左向右用直线连接起来而构成的图形,在以时间序列为x轴的线图中,可以看到数据增长的趋势. geom_line(mapping = NULL, data = NULL ...
随机推荐
- LeetCode 题解之Rotate List
1.题目描述 2.题目分析 首先数出链表中的元素个数count,然后对k = k % count 求余数.接着将链表形成一个环,从最后一个元素开始,运动 count - k 步,此时节点的下一个节点 ...
- mysql 内存统计
在 mysql 5.5 中实现了类似mysql5.7中performance schema 的内存统计功能. 功能 1 展示mysql层内存总大小. 2 展示mysql层内存使用分布情况. 3 展示每 ...
- 什么是 Azure 中的虚拟机规模集?
虚拟机规模集是一种 Azure 计算资源,可用于部署和管理一组相同的 VM. 由于所有 VM 的配置都相同,因此无需对 VM 进行任何预先配置. 这样就可以更方便地构建面向大型计算.大数据.容器化工作 ...
- 使用SQL Server Management Studio操作replication时,要用机器名登录,不要用IP地址
如果你在使用SSMS(SQL Server Management Studio)登录SQL Server时,使用的是IP地址,如下图所示: 当你操作replication时,会报错: 从上面的错误提示 ...
- 如何让VB6代码编辑器垂直滚动条随鼠标滚轮滚动
VB6毕竟是很老的产品了,它的代码编辑器垂直滚动条并不能随鼠标的滚轮而滚动,这个问题会让我们在编写代码的时候觉得很不方便,不过还是有一种方法可以解决这个问题的. 先下载一个微软发布的“VB6ID ...
- Nlog.Config:日志方法步骤
首先添加negut包Nlog.Config: 安装完毕以后,可以替换Nlog.config <?xml version="1.0" encoding="utf-8& ...
- 高通LCD的pwm背光驱动
发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? ...
- Markdown 进阶
目录 markdown进阶语法 内容目录 加强代码块 脚注 流程图 时序图 LaTeX公式 markdown进阶语法 内容目录 使用 [TOC] 引用目录,将 [TOC] 放至文本的首行,编辑器将自动 ...
- apk静态注射[转]-未实践
原文:http://free0coding.iteye.com/blog/1684263 1.将需要注入的代码块打包成jar1,释放一个公共类的静态方法a 2.反编译apk得到smali文件,在适当 ...
- 给SVN设置代理
XP系统在C:\Documents and Settings\Administrator\Application Data\Subversion目录下 win7及以上系统在C:\Users\admin ...