安利一下R for Data Science这本书,作为R数据处理的神器。
全文思想就是获得整洁数据(tidydata),并进行后续分析和可视化。
https://r4ds.had.co.nz/data-visualisation.html
学习流程
tidydata:每一列都是变量,每一行都是观察值
整洁的数据非常重要,因为一致的结构使您可以将精力集中在有关数据的问题上,而不是为了使数据以正确的形式针对不同的功能而奋斗。
ready
运行本书中的代码,需要四件事:R,RStudio,称为tidyverse的R软件包的集合,以及少数其他软件包。包是可复制R代码的基本单位。它们包括可重用的功能,描述如何使用它们的文档以及示例数据。
install.packages("tidyverse")
除非您使用加载软件包,否则将无法使用软件包中的函数,对象和帮助文件library()
。安装软件包后,可以使用以下library()
功能加载该软件包:
library(tidyverse)
#> ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
#> ✔ ggplot2 3.3.2 ✔ purrr 0.3.4
#> ✔ tibble 3.0.3 ✔ dplyr 1.0.2
#> ✔ tidyr 1.1.2 ✔ stringr 1.4.0
#> ✔ readr 1.4.0 ✔ forcats 0.5.0
#> ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag() masks stats::lag()
这告诉您tidyverse正在加载ggplot2,tibble,tidyr,readr,purrr和dplyr软件包。这些被认为是tidyverse的核心,因为您将在几乎所有分析中都使用它们。
在本书中,我们将从tidyverse外部使用三个数据包:
install.packages(c("nycflights13", "gapminder", "Lahman"))
这些软件包提供了有关航班,世界发展和棒球的数据,我们将用它们来说明关键的数据科学思想。
在整本书中,我们使用一致的约定集来引用代码:
函数采用代码字体,后跟括号,如
sum()
或mean()
。其他R对象(如数据或函数参数)采用代码字体,不带括号,如
flights
或x
。如果要弄清楚对象来自哪个包,我们将使用包名称,后跟两个冒号,例如
dplyr::mutate()
或nycflights13::flights
。这也是有效的R代码。
1.6获得帮助并了解更多信息
这本书不是一本孤岛。没有任何一种资源可以使您掌握R。在您开始将本书中介绍的技术应用于您自己的数据时,您很快就会发现我们无法回答的问题。本节介绍了有关如何获取帮助以及帮助您继续学习的一些技巧。
如果您遇到困难,请从Google开始。通常,在查询中添加“ R”足以将其限制在相关结果中:如果搜索没有用,则通常意味着没有任何特定于R的结果可用。Google对于出现错误消息特别有用。如果收到错误消息,但不知道它是什么意思,请尝试使用Google搜索。过去可能有人对此感到困惑,并且网络上的某些地方会有所帮助。(如果错误消息不是英语的,请运行Sys.setenv(LANGUAGE = "en")
并重新运行代码;您更有可能找到英语错误消息的帮助。)
如果Google没有帮助,请尝试stackoverflow。首先花一点时间搜索现有的答案,包括[R]
将搜索范围限制在使用R的问题和答案上。如果找不到有用的东西,请准备一个最小的可复制示例或reprex。好的代表可以使其他人更轻松地为您提供帮助,而且通常您会在解决问题的过程中自己解决问题。
为了使示例可重现,需要包括三件事:所需的程序包,数据和代码。
程序包应加载到脚本的顶部,因此很容易看到示例所需的程序包。现在是检查每个软件包是否使用最新版本的好时机。自安装软件包以来,您可能已经发现了已修复的错误。对于tidyverse中的软件包,最简单的检查方法是运行
tidyverse_update()
。-
在问题中包含数据的最简单方法是使用
dput()
生成R代码来重新创建它。例如,要mtcars
在R中重新创建数据集,我将执行以下步骤:dput(mtcars)
在R中运行复制输出
在我的可复制脚本中,键入
mtcars <-
然后粘贴。
尝试找到仍能揭示问题的最小数据子集。
-
花一点时间来确保您的代码易于他人阅读:
确保您使用了空格,并且变量名简洁明了,但内容丰富。
使用注释来指示您的问题所在。
尽力删除与该问题无关的所有内容。 您的代码越短,越容易理解,也越容易修复。
通过开始一个新的R会话并复制并粘贴脚本来检查您是否确实制作了一个可复制的示例。
您还应该花一些时间为解决问题做准备。从长远来看,每天花一点时间学习R将会获得丰厚的回报。一种方法是在RStudio博客上关注Hadley,Garrett和RStudio其他所有人的行为。我们在这里发布有关新软件包,新IDE功能和现场课程的公告。您可能还希望在Twitter上关注Hadley(@hadleywickham)或Garrett(@statgarrett),或者关注@rstudiotips以跟上IDE中的新功能。
为了更广泛地与R社区保持联系,我们建议阅读http://www.r-bloggers.com:它汇集了来自世界各地的500多个有关R的博客。如果您是活跃的Twitter用户,请遵循(#rstats
)标签。Twitter是Hadley用来跟上社区的新发展的主要工具之一。
数据可视化
使用ggplot2,您可以使用函数开始绘图ggplot()
。ggplot()
创建一个可以添加图层的坐标系。的第一个参数ggplot()
是要在图形中使用的数据集。因此,ggplot(data = mpg)
创建一个空图,但这不是很有趣,因此我将不在这里显示。
您可以通过向中添加一层或多层来完成图形ggplot()
。该函数geom_point()
在您的绘图上添加了一层点,从而创建了一个散点图。ggplot2附带了许多geom函数,每个函数都会在绘图中添加不同类型的图层。在本章中,您将学到很多。
ggplot2中的每个geom函数都有一个mapping
参数。这定义了数据集中的变量如何映射到视觉属性。的mapping
参数总是与配对aes()
,以及x
和y
的参数aes()
指定要映射哪些变量的x和y轴。ggplot2在自data
变量(在本例中为)中查找映射的变量mpg
。
3.2.3图形模板
让我们将此代码转换为可重复使用的模板,以使用ggplot2制作图形。要制作图表,请将下面代码中的方括号部分替换为数据集,geom函数或一组映射。
ggplot(data = ) +
(mapping = aes())
3.3 增加变量
美学映射,第三个变量
您可以class
通过将其映射到美感来向二维散点图添加第三个变量,例如。美观是情节中对象的视觉属性。美学包括点的大小,形状或颜色之类的东西。您可以通过更改其美学属性的值,以不同方式显示一个点(如下所示)。由于我们已经使用“值”一词来描述数据,所以让我们使用“水平”一词来描述美学特性。在这里,我们更改点的大小,形状和颜色的级别,以使该点变小,呈三角形或呈蓝色:
gplot2一次只能使用六个形状。默认情况下,使用形状美学时,其他组将不作图。
对于每种美学,您都aes()
可以将美学名称与要显示的变量相关联。该aes()
函数将图层使用的每个美学映射收集在一起,并将其传递给图层的映射参数。语法突出显示了有关x
和的有用见解y
:点的x和y本身就是美观,可视化的属性,您可以将其映射到变量以显示有关数据的信息。
一旦绘制了美学图,ggplot2就会处理其余的工作。它选择了一个合理的比例以配合美学,并构造了一个图例来解释级别和值之间的映射。对于x和y美学,ggplot2不会创建图例,但会创建带有刻度线和标签的轴线。轴线充当图例;它说明了位置和值之间的映射。
手动更改图形的美学属性
还可以手动设置几何图形的美学属性。例如,我们可以将图中的所有点设为蓝色:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy), color = "blue")
在这里,颜色不会传达有关变量的信息,而只会改变图形的外观。要手动设置美学,请按名称将美学设置为geom函数的参数;即它去外面的aes()
。您需要选择一种对于这种美学有意义的水平:
颜色的名称,作为字符串。
点的大小,以毫米为单位。
点的形状为数字,如图3.1所示。
R具有25个内置的形状,这些形状由数字标识。 有一些看似重复的对象:例如,0,15和22都是正方形。 区别来自“颜色”和“填充”美学的相互作用。 空心形状(0--14)的边界由“ colour”确定; 实心形状(15--20)填充有“颜色”; 填充的形状(21--24)的边界为“颜色”,并填充为“填充”。
3.4常见问题
当您开始运行R代码时,您可能会遇到问题。
首先,将您正在运行的代码与本书中的代码进行仔细比较。R非常挑剔,并且放错位置的字符可能会有所不同。确保每个(
都与匹配,)
每个"
都与另一个配对"
。有时,您将运行代码,但没有任何反应。检查控制台的左侧:如果是a +
,则表示R认为您没有键入完整的表达式,它正在等待您完成它。在这种情况下,按ESCAPE中止当前命令的处理通常很容易从头开始。
创建ggplot2图形时,一个常见的问题是将放在+
错误的位置:它必须出现在行的末尾,而不是开始。换句话说,请确保您没有意外地编写如下代码:
ggplot(data = mpg)
+ geom_point(mapping = aes(x = displ, y = hwy))
如果仍然遇到问题,请尝试帮助。通过?function_name
在控制台中运行,或选择函数名称并在RStudio中按F1,可以获得有关任何R函数的帮助。如果帮助看起来没有帮助,请不要担心-而是跳到示例并查找与您要执行的操作匹配的代码。
如果这样做没有帮助,请仔细阅读错误消息。当然,搜索引擎更是一大利器,多搜索,会得到想要的答案。
3.5子图
添加其他变量的一种方法是图形美学。另一种对分类变量特别有用的方法是将绘图划分为构面(子图),每个子图显示数据的一个子集。
要通过单个变量对图进行分面,请使用facet_wrap()
。的第一个参数facet_wrap()
应该是公式,在公式中创建~
后跟一个变量名(此处的“公式”是R中数据结构的名称,而不是“等式”的同义词)。您传递给的变量facet_wrap()
应该是离散的。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_wrap(~ class, nrow = 2)
要在两个变量的组合上显示,请添加facet_grid()
到情节调用中。的第一个参数facet_grid()
也是一个公式。这次,公式应包含两个变量名,并用a分隔~
。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(drv ~ cyl)
如果您不希望在行或列维中不使用构面,请使用a.
代替变量名,例如 + facet_grid(. ~ cyl)
。
3.6几何对象
两个图都包含相同的x变量,相同的y变量,并且都描述相同的数据。但是情节并不相同。每个图都使用不同的视觉对象来表示数据。用ggplot2语法,我们说它们使用不同的geoms。
geom是绘图中用来表示数据的几何对象。人们通常根据地块使用的几何类型来描述地块。例如,bar charts use bar geoms, line charts use line geoms, boxplots use boxplot geoms, and so on.散点图打破了趋势。他们使用点几何。如上所述,您可以使用不同的几何图形来绘制相同的数据。上侧的图使用点几何,而下侧的图使用平滑几何,即拟合数据的平滑线。
要更改绘图中的几何图形,请更改添加到的几何图形功能ggplot()
。例如,要绘制上面的图,可以使用以下代码:
# up
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
# down
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
要在同一图中显示多个几何图形,请将多个几何图形功能添加到ggplot():
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
geom_smooth(mapping = aes(x = displ, y = hwy))
进阶:但是,这在我们的代码中引入了一些重复。想象一下,如果您想将y轴更改为cty而不是hwy。您需要在两个地方更改变量,而您可能忘记更新一个。您可以通过将一组映射传递到来避免这种重复ggplot()。ggplot2会将这些映射视为适用于图中每个geom的全局映射。换句话说,此代码将产生与先前代码相同的图:
ggplot(data = mpg) +
geom_point() +
geom_smooth()
如果将映射放置在geom函数中,则ggplot2会将其视为该图层的本地映射。它将仅使用这些映射来扩展或覆盖该层的全局映射。这使得可以在不同的层中显示不同的图形。
geom_point(mapping = aes(color = class)) +
geom_smooth()
??geom
练习
#在脑海中运行这段代码,并预测输出结果。然后,在R中运行代码并检查您的预测。
ggplot(data = mpg, mapping = aes(x = displ, y = hwy, color = drv)) +
geom_point() +
geom_smooth(se = FALSE)
ggplot(data = mpg) +
geom_smooth(
mapping = aes(x = displ, y = hwy, color = drv),
show.legend = FALSE #不添加标签 )
#这两图是否一致
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth()
ggplot() +
geom_point(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_smooth(data = mpg, mapping = aes(x = displ, y = hwy))
重新创建生成以下图形所需的R代码。
3.7统计转换
接下来,让我们看一下条形图。条形图看起来很简单,但是它们很有趣,因为它们揭示了一些关于图的细微之处。考虑使用绘制的基本条形图geom_bar()
。下图显示了diamonds
数据集中的钻石总数,按分组cut
。该diamonds
数据集进来GGPLOT2,并包含〜54000颗钻石,其中包括信息price
,carat
,color
,clarity
,和cut
每颗钻石的。图表显示,高质量切割的钻石比低质量切割的钻石更多。
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))