R和RStudio简介

144 阅读10分钟

Introduction to R and RStudio

随着计算能力的提高,对大量可自由获取的数据的访问也越来越多。人们正在用生产力、卡路里、健身和睡眠追踪器追踪他们的生活。政府正在公布左右的调查数据,而公司则进行需要分析的受众测试。即使是现在,也有很多数据在那里,随时可以被抓取和查看。

Graphs and Analytics

在本教程中,我们将了解R编程语言的基础知识--一种专门为统计计算而构建的语言。我不会用维基百科的定义来烦扰你。相反,让我们直接进入它。在这个介绍中,我们将涵盖默认IDE和语言的安装,以及其数据类型。

安装

R既是一种编程语言,也是一种软件环境,这意味着它是完全独立的。要安装它有两个步骤:

两者都是免费的,都是开源的。R将被安装为底层引擎,为RStudio的计算提供动力,而RStudio将提供样本数据、命令自动完成、帮助文件,以及快速完成工作的有效界面。你可以像大多数其他语言一样在简单的文本文件中编写R代码,但鉴于有这么多的命令,以及事情会很快变得很复杂,所以真的不建议这样做。

在你安装了这些工具之后,启动R Studio。

RStudio IDE

集成开发环境区域

让我们简单地解释一下图形用户界面。有四个主要部分。我将解释默认的顺序,尽管注意到这可以在**设置/**首选项>窗格布局中改变。

编辑器

The Editor

左上角的象限是编辑器。这是你写R代码的地方,你想在以后保留这些代码--函数、类、包,等等。就所有的意图和目的而言,这与其他所有代码编辑器的主窗口是相同的。除了一些不言自明的按钮,还有一些在这个起点上不需要关心的按钮,还有一个 "保存时的源代码 "复选框。这意味着 "每次保存文件时,将文件的内容加载到我的控制台的运行时间"。你应该在任何时候都打开这个选项,因为它能使你的开发流程更快,只需一次点击。

控制台

The Console

左下角的象限是控制台。它是一个R的REPL,你可以在其中测试你的想法、数据集、过滤器和函数。这是你在开始时花费大部分时间的地方。在这里,你可以验证你的想法是否可行,然后再把它复制到上面的编辑器中。这也是你的R文件在保存时的来源环境(见上文),所以每当你在上面的R文件中开发一个新函数,它就会自动在这个REPL中可用。在本教程的其余部分,我们将在 REPL 中花费大量时间。

历史/环境

History/Environment Pane

右上角的象限有两个标签:环境历史

环境指的是控制台环境(见上文),将详细列出你在控制台中定义的每一个符号(无论是通过源码还是直接)。也就是说,如果你有一个在REPL中可用的函数,它将被列在环境中。如果你有一个变量,或一个数据集,它将被列在那里。在这里,你也可以手动导入自定义数据集,并使它们在控制台中立即可用,如果你不喜欢输入命令来这样做的话。你还可以检查你安装和加载的其他软件包的环境。(以后会有更多关于包的内容。)继续玩吧,你不会破坏任何东西。

历史记录列出了自上次项目开始以来你执行的每一条控制台命令。它被保存在你的项目文件夹中一个隐藏的.Rhistory 文件中。如果你不选择在一个会话后保存你的环境,历史记录就不会被保存。

杂项

Misc pane

右下方的面板是杂项面板,包含五个独立的标签。第一个,文件,是不言自明的。

在这里你可以缩放、导出、配置和检查你的图表和图形。

每个可用的旁边都有一个简短的描述,尽管有许多比那里列出的包更多。我们将在后面的文章中介绍软件包库。

帮助选项卡让你搜索令人难以置信的广泛的帮助目录,并且当你在控制台中调用命令的帮助时将自动打开。(调用帮助的方法是在命令名前加一个问号,像这样。?data.frame.)

最后,查看器本质上是RStudio的内置浏览器。是的,你可以用R开发网络应用,甚至在它里面启动本地托管的网络应用。

内置数据集

在下面的文字中,只要我提到使用一个命令,就认为这意味着将其打入控制台。因此,如果我说 "我们用?data.frame"查看DataFrames的帮助,你就这样做:

A gif showing ?data.frame beign run in the console

RStudio自带了一些数据集,供新用户使用。要使用一个内置的数据集,我们用data 函数加载它,并提供一个与我们想要的集合相对应的参数。要查看所有可用的内置数据集,请输入data() ,不要输入参数。

Data Sets in RStudio

看一下可用的数据集列表,让我们先加载一个非常小的数据集:

data('women')

你应该看到women 变量出现在环境面板上,尽管它的第二个字段写着<Promise> 。在这种情况下,一个承诺仅仅意味着 "当你真正需要它的时候,数据就会出现"。我们告诉R加载这组数据,但我们实际上还没有在任何地方使用它,所以它觉得没有必要将它完全加载到内存中。让我们告诉R我们需要它。在控制台中,通过简单地调用这个来打印出整个集合:

women

这等同于:

print(women)

注意:我们将使用前一种方法,只是因为它的输入量较少。记住:在R语言中,最后一个输入的值如果不是表达式(比如赋值或求和的东西)就会被自动打印到控制台。

数字将在控制台中产生,women 的环境条目应该改变。你现在也应该能够在环境面板中看到这些数据了,只要点击变量名称旁边的蓝色展开箭头即可。

Women dataset, expanded

这个集合只有15个条目,因此没有提供任何有价值的东西,但对于玩耍来说,它已经足够了。

为了进一步研究你正在处理的这个集合,有几个函数需要记住(每个函数的演示可以在解释下面看到):

  • nrow/ncol 将分别列出行/列的数量。
  • summary 将输出一个关于该集合的列的摘要。在 集的例子中,我们有两个数字列(两列都是数字,或者换句话说,每一列都是一个数字向量;后面会有更多关于数据类型和向量的内容)。而R知道,当你要求它分析一个数字向量时,它应该给你这种集合的典型值:集合中的最小值,最小值和平均值之间的平均值(平均),平均值(所有值的平均值),平均值和最大值之间的平均值,以及最大值,列中最大的数字。它对高度和宽度都是这样做的。对于不同类型的向量(比如每个元素都是一个词而不是一个数字),输出是不同的。women
  • str 是一种不同的总结。事实上, 代表 "结构",它输出的是一个数据集结构的摘要。在我们的例子中,它将告诉我们这是一个 "data.frame"(一种特殊的数据类型,我们将在后面解释),有15个obs(观察值或行)和两个变量(或列)。然后,它将列出DataFrame中的所有列以及它们的一些(但不是全部)值,这样我们就能掌握我们正在处理的值的种类了。str
  • dim 给你一个数据集的尺寸。调用 可以得到 ,这意味着15行和2列。 可以用来计算一个集合中垂直元素的数量。在向量中(见下文),这是元素的数量;在数据集中,如 ,这是列的数量。dim(women) 15 2 length women
> nrow(women)
[1] 15
> ncol(women)
[1] 2
> summary(women)
     height         weight     
 Min.   :58.0   Min.   :115.0  
 1st Qu.:61.5   1st Qu.:124.5  
 Median :65.0   Median :135.0  
 Mean   :65.0   Mean   :136.7  
 3rd Qu.:68.5   3rd Qu.:148.0  
 Max.   :72.0   Max.   :164.0  
> str(women)
'data.frame':    15 obs. of  2 variables:
 $ height: num  58 59 60 61 62 63 64 65 66 67 ...
 $ weight: num  115 117 120 123 126 129 132 135 139 142 ...
> dim(women)
[1] 15  2

你将会经常使用这些函数,所以我建议你熟悉它们。加载一些其他的数据集,像这样检查它们。没有必要对它们熟记于心。本教程和帮助文件将一直作为参考,但无论如何,能够流利地使用它们是很好的。

数据类型

R有一些典型的原子数据类型,你已经从其他语言中了解到了,但它也提供了一些更倾向于统计的数据。让我们简单地了解一下这些类型。在解释这些类型的同时,我将谈谈分配它们的问题。R中的赋值是通过 "左箭头 "操作符或<- ,如:

myString <- 'Hello, World!'

然而,R是非常宽容的,如果你不喜欢每次都打出箭头,它会让你在控制台等顶级环境中使用= 赋值运算符

myString = 'Hello World'

我建议你习惯于使用箭头,因为没有它,你不会走得很远。

要检查一个变量的类型(或类别),可以使用class 函数(尽管上面的str 几乎做了同样的事情)。class(myString).

原子类

原子类是基本的类型,其他的类型都是由它构成的。

字符类

character 类是你典型的字符串,是一组一个或多个字母:

> myString <- 'Hello World'
> class(myString)
[1] 'character'

[1] 将在下面的 "矢量 "部分进行解释。

数值型

numeric 类对应于其他语言中的float 。它表示数字值,如10、15.6、-48792.54982749879等等。

> myNum <- 5.983904798274987298
> class(myNum)
[1] 'numeric'

你可以强迫(改变)数字字符串值为数字类型,像这样:

> myString <- '5.60'
> class(myString)
[1] 'character'
> myNumber <- as.numeric(myString)
> myNumber
[1] 5.6
> class(myNumber)
[1] 'numeric'

还有一个特殊的数字Inf ,表示无穷大。它可以在计算中使用:

> 1/0
[1] Inf

另一个 "数字 "是NaN ,它代表 "不是一个数字"。当你做类似0/0 的事情时,你就会得到这个数字。

整数

整数是整数,尽管它们在保存到变量时被自动强制(改变)为数字:

> myInt <- 209173987
> class(myInt)
[1] 'numeric'

为了真正迫使它们成为整数,我们需要调用一个手动强制它们的函数,称为as.integer :

> myInt <- as.integer(myInt)
> class(myInt)
[1] 'integer'

你可以通过设置整数的后缀L 来防止自动强制:

> myInt = 5L
> class(myInt)
[1] 'integer'

请注意,如果你给了R一个大于其内存所能存储的数字,它就会自动将其转化为一个实数,即使你在最后加上L :

> myInt <- 2479827498237498723498729384
> class(myInt)
[1] 'numeric'
> myInt
[1] 2.479827e+27

但是如果你想把这个数字变成一个整数,R就会把它丢掉,因为它根本无法做出那么大的整数。你得到的不是一个数字,而是 "NA",这是R的一种特殊类型,表示 "不可用",也被称为缺失值:

> myIntCoerced <- as.integer(myInt)
Warning message:
NAs introduced by coercion
> myIntCoerced
[1] NA
> class(myIntCoerced)
[1] 'integer'

NA仍然是 "整数 "的一种类型,但它没有值。

请注意,当把数字强制转换成整数时,小数位会丢失。这同样适用于从数字的小数点串中进行胁迫。

> myString <- '5.60'
> myNumeric <- 5.6
> myInteger1 <- as.integer(myString)
> myInteger2 <- as.integer(myNumeric)
> myInteger1 == myInteger2
[1] TRUE
> myInteger1
[1] 5