ggplot2-数据变换1

简介

数据整理十分重要,但它并不是数据调整的终点。通常,得到的变量并非100%合适,或是有时还需要先对它们做一些聚合才能对其可视化。这一章将展示如何利用dplyr包来解决这个(以及更多)问题
dplyr提供了一系列数据操作的动词(函数),它们可以满足常见的95%的操作需求。dplyr和ggplot2很相似,区别仅仅在于一个提供图形的语法,而另一个提供数据操作的语法。和ggplot2一样,dplyr不仅仅提供了现成的函数,它还让人深入思考何谓数据操作。特别地,dplyr通过限制的方法帮助选择:与其在成千上万个函数中苦苦挣扎,不知道该用什么,不如从一小撮特意设计的却最可能有用的函数中挑选。本章中,将讲解dplyr中最重要的四个函数

  • filter()
  • mutate()
  • group_by() 和 summarise()

这些函数非常容易掌握,因为它们的使用方式是一样的:将一个数据框作为第一个参数,并返回调整后的数据框。其它的参数则控制格式变换的细节。这里将用同样的方法介绍每一个函数:以diamonds数据为例,深入介绍函数的细节并以练习作为结束,从而充分实践其技能

之后还将了解到如何利用%>%进行数据数据变换的管道操作。%>%和ggplot2中的+充当着类似的角色:它能将复杂难懂的问题分成多个简单易懂的小部分。

本章只触及dplyr能力的表面,但也足以帮助解决可视化的问题。通过本章最后讨论的资源,可以了解到更多内容

筛选观测

一个常见的情况是,只需要探索数据集的一部分。数据分析的一个优秀策略就是首先从一个观测单元开始(一个人、一个城市等),先理解它的情况,之后再将结论推广到其它情况。当对分析不知所措时,这个方法行之有效:先筛选出一个小子集,充分掌握它,然后再考虑全部,将结论推用于整个数据集

筛选也是一个提取异常值的有效方法。通常,可能并不像简单粗暴地删去它们,因为它们也可能包含非常重要的信息。但是考虑将数据划分为寻常和异常则非常有用可以通过总结寻常的点来看大的趋势,也可以通过单独检查异常值来看看究竟发生了什么事

下面这张图展示了钻石x和y维度的相关情况

ggplot(diamonds, aes(x, y)) + geom_bin2d()

在这里插入图片描述

数据集中大约有五万个点:大部分点都在对角线附近,但存在异常值。一部分明显有问题的值是维度为0的钻石,可以用filter()函数将其筛选出来

filter(diamonds, x == 0 | y === 0)

这个过程等价于原始R代码diamonds[diamonds$x == 0 | diamond$y == 0],但是表达更为简洁,因为filter()函数知道要针对行来进行筛选

如果之前用过subset()函数,会发现这是个十分类似的操作,最大的区别在于subset()既可以选择观测也可以选择变量,而在dplyr中,filter()仅能选择观测而select()仅能选择变量。另外还有一些细小的不同,但利用filter()的优势在于它和dplyr中其它的函数各司其职,从而运算速度稍快于subset()

在实际的分析中,需要仔细检查这些异常值,以试图找到造成这个数据质量问题的根源。但在本例中,将直接删去它们并集中注意力在那些留下的点上
为了少打一些字,对filter()函数输入一些参数,来把它们组合起来

diamonds_ok <- filter(diamonds, x > 0, y > 0, y < 20)
ggplot(diamonds_ok, aes(x, y)) + geom_bin2d() +
	geom_abline(slope = 1, color = "white", size = 1, alpha = 0.5)

在这里插入图片描述

这个图看起来很有意义,可以看到x和y之间的强相关性。在图上增加了参考线,可以很清楚地看到,对于绝大多数钻石来说,x和y是十分相近地。然而,这个图仍然存在一些问题

  • 这个图几乎是空白地,因为绝大多数点都位于对角线上
  • 图上仍有一些明显的二元异常值,但是很难再用一个简单的筛选将它们选出来

有用的工具

filter()的第一个参数是数据框。第二个及之后的参数都必须是逻辑向量:filter()函数将选出每一个分量的逻辑表达都为TRUE的行。逻辑向量必须和数据框等宽,否则将会报错。通常可以通过比较运算符建立逻辑向量

  • x == y x和y相等
  • x != y x和y不相等
  • x %in% c(“a”, “b”, “c”) x属于右侧
  • x > y、x >= y、x < y、x <= y 大于、大于等于、小于、小于等于

然后用逻辑运算符把它们组合起来

  • !x 取非
  • x & y 与
  • x | y 或
  • xor(x, y) 异或(其中之一为TRUE且不都为TURE,则为TRUE)

大部分真实情况的需求都包含这两种的组合

  • 价格小于500美元 price < 500
  • 大小在1到2克拉之间 carat >= 1 & carat <2
  • 切工是Idel或是Premium cut == “Premium” | cut == “Ideal”
  • 颜色、切工和净度都最差 cut == “Fair” & color == “J” & clarity == “SI2”

也可以在筛选条件中使用函数

  • 大小在1到2克拉之间 floor(carat) == 1
  • 平均维度大于3 (x + y + z) / 3 > 3

尽管直接使用简单的表达式很实用,但当情况变得复杂时,最好还是先建立一个新变量,从而可以确保在取子集之前的那些计算都是正确的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值