数据分析的工作,80%的时间耗费在处理数据上,而数据处理的主要过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,首先,把数据根据特定的字段分组,每个分组都是独立的;然后,对每个分组按照业务需求执行转换;最后,把转换后的结果组合在一起。在数据处理中,经常需要循环访问数据,R语言是矢量化的,天生具有处理循环操作的优势。

使用ggplot2包中的diamonds数据集做为示例数据

  1. > install.packages('ggplot2')
  2. > library(ggplot2)
  3. > data("diamonds")

data()函数的作用是加载指定的数据集,本例将加载ggplot2包中的diamonds数据集,这个数据集在下文直接引用。

一,使用aggregate()函数做数据变换

在研究数据时,有时需要对数据按照特定的字段进行分组,然后统计各个分组的数据,这就是SQL语法中的分组-聚合操作,使用aggregate()函数对数据进行简单的数据处理。

aggregate()函数用于把数据分离为单独的子集,为每一个子集计算聚合值,然后把聚合值结合(combine)在一起返回。

  1. 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的平均值:

  1. aggregate(price~cut,diamonds,mean)

2,多个分组变量

aggregate()函数能够添加多个分组变量,只需要在formula右侧添加变量,并用加号“+”隔离:

  1. > aggregate(price~cut+color,diamonds,mean)
  2. cut color price
  3. Fair D 4291.061
  4. Good D 3405.382
  5. Very Good D 3470.467
  6. ....

3,多个聚合变量

aggregate()函数能够添加多个聚合变量,只需要在formula左侧,使用函数cbind()把两个变量组合起来:

  1. > aggregate(cbind(price,carat)~cut,diamonds,mean)
  2. cut price carat
  3. Fair 4358.758 1.0461366
  4. Good 3928.864 0.8491847
  5. Very Good 3981.760 0.8063814
  6. Premium 4584.258 0.8919549
  7. Ideal 3457.542 0.7028370

4,多个分组变量和多个聚合变量

aggregate()函数能够formular对象的两侧分别添加多个变量,按照多个分组变量和多个聚合变量执行聚合运算

  1. > aggregate(cbind(price,carat)~cut+color,diamonds,mean)
  2. cut color price carat
  3. Fair D 4291.061 0.9201227
  4. Good D 3405.382 0.7445166
  5. ....

二,计数

R中计数比较特殊,plyr包中有一个计算函数count(),参数vars定义分组的变量,该函数会把重复值计算N次:

  1. count(df, vars = NULL)

使用aggregate()来实现分组计数,使用length(x)来计算向量中元素的个数,该函数会把重复值计算N次:

  1. aggregate(cut~color,diamonds,length)

为了计算唯一值的数量,可以使用unique(x),在计数之前,对向量元素去重:

  1. aggregate(cut~color,diamonds,function(x) length(unique(x)))

三,数据变换(dplyr包)

dplyr包提供灵活的数据操作,用于对数据框执行转化和重塑,这个包是plyr包的升级版本,侧重于处理数据框对象,因此其名字带d(data frame),dplyr包是R开发人员必学必会的包。

dplyr包有三个主要的目标:

  • 更加灵活和简单地处理数据框;
  • 使用内存,提高数据处理的性能;
  • 使用相同的接口处理数据,无论数据存储在何处,无论是在数据框中,数据表或数据库。
1,tlb类型
dplyr包不是默认安装的包,在使用之前,需要使用以下命令安装和引用dplyr包:
  1. install.packages("dplyr")
  2. library(dplyr)

dplyr包只能用于tibble(简称tbl)类型的对象,tibble 类型是dplyr包特有的对象类型(data frame tbl / tbl_df)。在利用dplyr包处理数据之前,建议把数据框装载成tibble类型,可以调用 tbl_df()函数把数据框类型转化成 tibble 类型的数据对象:

  1. > df <- tbl_df(diamonds)

2,投影函数(select)

从tbl对象中,选择特定的数据列显示,select()函数的第一个参数是tibble对象,后续的参数是tbl对象中的变量名:

  1. > select(df,carat,cut,color)

2,筛选函数(filter)

从tbl对象中,按照特定的条件过滤数据:

  1. > filter(df,color=='E')

3,转换函数(mutate)

根据tbl对象中的数据,应用指定的公式,派生新的数据列,或重写已经存在的数据列:

  1. > mutate(df,avg_ct=price/carat)

4,汇总函数(summarize)

对tbl对象执行聚合运算,如果tbl对象已经被分组,那么单独对每个分组进行聚合运算:

  1. > summarize(df,avg_prince=mean(price),avg_ct=mean(carat))

5,分组函数(group_by)和移除分组(ungroup)

使用group_by()函数对tbl对象执行分组,被分组之后,tbl对象处于分组状态,可以使用ungroup函数,移除tbl对象的分组状态。

  1. group_by(df,color)

6,排序函数(arrange)

arrange()函数对tbl变量进行排序,默认是按照字段的升序值排序,使用desc(field),可以按照字段的降序值排序:

  1. > arrange(df,color)

7,管道操作符(%>%)

管道操作符(%>%)用于把前一步操作的结果集(变量类型是tbl)传递到给函数的第一个参数中,同时函数的第一个参数可以省略,例如:

  1. > df %>% group_by(color) %>% summarize(mean(price))
  2. # A tibble: x
  3. color `mean(price)`
  4. <ord> <dbl>
  5. D 3169.954
  6. E 3076.752
  7. F 3724.886
  8. G 3999.136
  9. H 4486.669
  10. I 5091.875
  11. J 5323.818

8,连接操作(join)

dplyr包还提供了连接(join)操作,

  1. inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
  2. left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
  3. right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
  4. full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
  5. semi_join(x, y, by = NULL, copy = FALSE, ...)
  6. 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)

  1. #取两个集合的交集
  2. intersect(x,y, ...)
  3.  
  4. #取两个集合的并集,并进行去重
  5. union(x,y, ...)
  6.  
  7. #取两个集合的并集,不去重
  8. union_all(x,y, ...)
  9.  
  10. #取两个集合的差集
  11. setdiff(x,y, ...)
  12.  
  13. #判断两个集合是否相等
  14. setequal(x, y, ...)

10,绑定操作

dplyr包提供了按行/列合并数据集的函数,合并的对象为数据框,也可以是能够转换为数据框的列表。按行合并函数bind_rows()通过列名进行匹配,不匹配的值使用NA替代,类似于base:: rbind()函数。按列合并函数bind_cols()通过行号匹配,因此合并的数据框必须有相同的行数,函数类似于base:: cbind()函数。原数据集行名称会被过滤掉。

  1. #按行合并,.id添加新列用于指明合并后每条数据来自的源数据框
  2. bind_rows(...,.id = NULL)
  3.  
  4. #按列合并
  5. bind_cols(...)
  6.  
  7. #合并数据集
  8. combine(...)

11,排名操作

  1. row_number(x)
  2. ntile(x, n)
  3. min_rank(x)
  4. dense_rank(x)
  5. percent_rank(x)
  6. cume_dist(x)

例如,对一个向量的元素进行排序:

  1. x <- c(, , , , , NA)
  2. row_number(x)

12,去重

对数据对象去重

  1. distinct(data, ..., keep_all = FALSE)

参数注释:

  • data:tbl对象
  • ... :可选的变量,用于指定去重的变量,如果去重的变量不唯一,那么只保留第一个观测
  • keep_all:设置为TRUE时,所有的变量都保留到.data,如果...的组合不唯一,那么只保留第一行的观测的各个变量值

13,计数

计数使用函数 n() 来实现,而统计数据集中无重复值的数量使用函数 n_distinct()来实现:

  1. n()
  2. n_distinct(..., na.rm = FALSE)

统计各个分组的观测数量,只能用于 summarise(), mutate() 和 filter() 中

  1. carriers <- group_by(flights, carrier)
  2. summarise(carriers, n())
  3. mutate(carriers, n = n())
  4. filter(carriers, n() < )

 

参考文档:

【R语言】必学包之dplyr包

R语言滴水穿石系列文章(一):dplyr-高效的数据变换与整理工具

R语言扩展包dplyr笔记

R: 矩阵运算及常用函数 II - aggregate

R学习笔记 第五篇:数据变换和清理的更多相关文章

  1. R学习笔记 第五篇:字符串操作

    文本数据存储在字符向量中,字符向量的每个元素都是字符串,而非单独的字符.在R中,可以使用双引号,或单引号表示字符,函数nchar用于获得字符串中的字符数量: > s='read' > nc ...

  2. R学习笔记(4): 使用外部数据

    来源于:R学习笔记(4): 使用外部数据 博客:心内求法 鉴于内存的非持久性和容量限制,一个有效的数据处理工具必须能够使用外部数据:能够从外部获取大量的数据,也能够将处理结果保存.R中提供了一系列的函 ...

  3. R学习笔记 第三篇:数据框

    数据框(data.frame)用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同的数据列的数据类型可以相同,也可以不同,但是,每列的长度必须相同.数据框的每列可以有唯一的命名,在已创 ...

  4. MyCat 学习笔记 第十篇.数据分片 之 ER分片

    1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键 ...

  5. MyCat 学习笔记 第八篇.数据分片 之 求摸运算分片

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在M ...

  6. MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片

    1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...

  7. (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)

    一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...

  8. 【数据分析 R语言实战】学习笔记 第五章 数据的描述性分析(下)

    5.6 多组数据分析及R实现 5.6.1 多组数据的统计分析 > group=read.csv("C:/Program Files/RStudio/002582.csv") ...

  9. R学习笔记 第四篇:函数,分支和循环

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

随机推荐

  1. C#抓取数据、正则表达式+线程池初步运用

    去年底用 多线程+HtmlAgilityPack.dll 写了一个抓取“慧聪网” 公司信息的小程序,代码惨不忍赌.好在能抓到数据,速度也能让人忍受就很久没管了. 最近这段时间把这个小程序发给同事看着玩 ...

  2. Js前端传递json数组至服务器端并解析的实现。

    最近做的一个小项目中需要将json数组数据传递到服务器端进行保存,现分享一下解决思路. 环境:EasyUi+Mvc 4.0 如下: 在上述截图中的红色圈起来的部分,需要在点击保存后通过一次ajax请求 ...

  3. webView 不能复制解决方案

    开发中遇到部分机型--主要是系统低于4.0,如果调用了WebView.setWebChromeClient的方法,则没办法长按复制文字 查了一下是系统的一个bug  https://bugzilla. ...

  4. java 如何将方法作为传参--多态

    在前段时研究智能算法时,发现如果使用java进行实现的话,往往具体实现过程差不多,但是适应值函数却根据 研究对象的不同发生很大的改变,这样对代码的维护产生很大的阻碍,于是产生的一个疑问:可不可以将适 ...

  5. memcached readme

    memcache======== http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html # 命令 ## 存 ...

  6. JAVA多线程--Thinking in java

    聊聊并发:http://ifeve.com/java-concurrency-thread-directory/ 阻塞状态: sleep  可中断利用 interrupt方法 wait IO  不可中 ...

  7. Delphi中paramstr的用法

    原型                function   paramstr(i:index):string        对于任何application paramstr(0)都默认代表的是应用程序的 ...

  8. URL编码解决

    与其他系统对接时遇到的问题URL中传递认证码,URL默认只允许传递ASCII码中的数据,所以浏览器默认会进行一次编码将%等特殊符号转义后台web服务器收到URL中的参数,会默认进行一次解码,但遇到的问 ...

  9. 【小程序】微信小程序实现各种特效实例

    写在前面 最近在负责一个微信小程序的前端以及前后端接口的对接的项目,整体上所有页面的布局我都已经搭建完成,里面有一些常用的特效,总结一下,希望对大家和我都能有所帮助 实例1:滚动tab选项卡 先看一下 ...

  10. 使用Xshell+Xmanager远程监控jvisualvm

    使用jvisualvm的remote方式监控服务器端jvisualvm时,不是很方便,因此通过local方式,应该是正路. 一.服务器端(Linux,最小安装模式,没有图形界面) 1.安装xauth ...