Chapter 2 新手上路 R Basics 1

R是一种区分大小写的解释型语言。你可以在命令提示符(>)后每次输入并执行一条命令,或者一次性执行写在脚本文件中的一组命令。R中有多种数据类型,包括向量、矩阵、数据框(与数据集类似)以及列表(各种对象的集合)。

2.1 R的数学运算:

可以当作最基本的计算器来使用。 * 加: + * 减: - * 乘: 除: / * 乘方: ^ * 取余数: %%

## [1] 10
## [1] 0
## [1] 15
## [1] 5
## [1] 32
## [1] 4

上面这些被称作表达式expression。

2.2 赋值

R使用<-作为赋值符号。 简单说来,赋值就是给一些东西取个名字,这样以后方便叫它。

是这么操作的:

咿呀,屏幕上没有显示任何输出? 不用惊讶,我们刚刚只是赋值把my_var存起来了,不信看RStudio右上角的“environment”。 my_var可在稍后被显示和继续使用。

然后你只需要输入my_var,R Console就将42输出来:

## [1] 42

上面我们提到了对象,对象是什么呢? 一个对象可以是任何能被赋值的东西。对于R来说,对象可以是任何东西(数据、函数、图形、分析结果,等等),我们后面会详细讲解不同对象。

我们也可以使用c() 這個函数 function(c 意指是 combine)来赋值,它把多个对象放到一起,组成向量。

## [1]  7 77

注释由符号#开头。在#之后出现的任何文本都会被R忽略而不运行。

2.3 使用 ? or help() 查询

输入?c 或者help(c),在RStudio 右下角的介面 召唤出帮助文件 Help。

2.4 功能包

上面的c()是我们遇到的第一个函数,我们以后还会遇到许许多多的函数。而功能包则是函数的有机组合,以实现更丰富的功能。

R自带了一系列默认包(包括base、datasets、utils、grDevices、graphics、stats以及methods),它们提供了种类繁多的默认函数和数据集。其他包可通过下载来进行安装。安装好以后,它们必须被载入到会话中才能使用。命令search()可以告诉你哪些包已加载并可使用。

第一次安装一个包,使用命令install.packages()即可,例如:

一个包仅需安装一次。但和其他软件类似,包经常被其作者更新。使用命令update.packages()可以更新已经安装的包。

要在R会话中使用包,还需要使用library()命令载入这个包:

当然,载入前,一定要先下载,确保有包可以调用才行。

然后我们就可以愉快的使用包了,具体来说里面的各种函数和数据。包中往往提供了演示性的小型数据集和示例代码,能够让我们尝试这些新功能。

使用 help(package=“package_name”)可以查看某个包的简短描述以及包中的函数名称和数据集名称的列表。使用函数help()可以查看其中任意函数或数据集的更多细节。

2.5 查看路径和设置路径

路径(工作路径)是我们读取数据和存贮结果的地方。 * getwd() * setwd(yourpath) * 或者使用RStudio右下方,Files这个tab里的齿轮来查看和更改。

2.6 数据类型

主要有这几种:

  • 数值型 numerics (1, 2.5)
  • 逻辑判断 logical (TRUE or FALSE)
  • 字符型 characters
  • 因子 factors

因子 factors复杂一点,也非常有用,单独来讲一下。

如何判断数据类型? 使用 class() 函数。

示例:

## [1] "numeric"
## [1] "character"
## [1] "logical"

2.7 数据结构

有这么几个:vector 向量、matrix 矩阵,dataframe 数据集,list 列表。 * 向量可以构成矩阵 * 矩阵是特殊的数据集 * list 是个筐,什么都能装

2.7.1 vector 向量

向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量。

这里,a是数值型向量,b是字符型向量,而c是逻辑型向量。 注意,单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型)。物以类聚,各从其类,同一向量中无法混杂不同模式的数据。

通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。例如’a[c(2)]’用于访问向量a中的第二个元素。

## [1] 2

更多示例如下:

## [1] "apple"  "orange"
## [1] FALSE  TRUE FALSE

最后一个语句中使用的冒号,意思是取第二个到第三元素。

2.7.2 matrix 矩阵

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。一般使用格式为:

其中vector包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选的、以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    4    7   10   13
## [2,]    2    5    8   11   14
## [3,]    3    6    9   12   15

我们可以使用下标和方括号来选择矩阵中的行、列或元素。‘r X[i,]’指矩阵X中的第i行,’r X[,j]’指第j列,’r X[i, j]’ 指第 i 行第 j 个元素。选择多行或多列时,下标 i 和 j 可为数值型向量。

##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,]    1    3    5    7    9   11   13   15   17
## [2,]    2    4    6    8   10   12   14   16   18
## [1]  2  4  6  8 10 12 14 16 18
## [1] 1 2
## [1]  6  8 10

矩阵都是二维的,和向量类似,矩阵中也仅能包含一种数据类型。

2.7.3 dataframe 数据框

由于不同的列可以包含不同模式(数值型、字符型等)的数据,所以啊,数据框真是是个筐,什么都能装!数据框将是你在R中最常处理的数据结构。

表2-1所示的分数数据集包含了数值型和字符型数据。由于数据有多种模式,无法将此数据集放入一个矩阵。在这种情况下,使用数据框是最佳选择。

划重点: * 列与列之间数据类型可以不一样,但是每一列数据类型必须一直。 * 我们在讨论数据框时将交替使用术语列和变量。 * 选取数据框中元素的方式:可以使用前述(如矩阵中的)下标记号,亦可直接指定列名,例如:

## [1] 100  80  70  95
## [1] 100  80  70  95
## [1] 100  80  70  95

第三个例子中的记号$是新出现的,它被用来选取一个给定数据框中的某个特定变量。例如,如果你想生成学生名字变量students和数学成绩变量math的新数据框,使用以下代码即可:

##   students_scores.students students_scores.math_score
## 1                        A                        100
## 2                        B                         80
## 3                        C                         70
## 4                        D                         95

2.7.4 因子 factor

因子 factor又叫分类变量,有两种:名义型、有序型。 * 名义型,例如,学生的名字,它们之间是没有顺序的。 * 有序型,例如,好评,中评,差评,它们之间有顺序关系,但是没有数量关系,得不出来不同级别之间的差异具体是多少。

相对应的,像之前栗子里,分数则是一个连续性变量,呈现为某个范围内的任意值,并同时表示了顺序和数量,例如95分就是比90分要高,并且是高5分。

因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。

函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1…k](其中 k 是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。

是不是有点晕,不着急,我们看点例子:

## [1] excellent bad       good      okay      bad      
## Levels: bad excellent good okay
## [1] excellent bad       good      okay      bad      
## Levels: bad < okay < good < excellent

这里我们成功的把字符型变量excellence,先转换成了无序因子变量,再转换成了有顺序的因子变量。

数值型变量可以用levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2,则以下语句:

## [1] 1 2 2 1 2 1 1 3
## [1] Male   Female Female Male   Female Male   Male   <NA>  
## Levels: Male Female

在这个栗子里,性别被当成类别型变量,标签“Male”和“Female”替代了1和2在结果中输出,而且所有不是1或2的性别变量将被设为缺失值。

2.7.5 list 列表

列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象(或成分,component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。可以使用函数list()创建列表:

## $title
## [1] "My First List"
## 
## [[2]]
## [1] 25 26 18 39
## 
## [[3]]
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10
## 
## [[4]]
## [1] "one"   "two"   "three"

本例创建了一个列表,其中有四个成分:一个字符串、一个数值型向量、一个矩阵以及一个字符型向量。可以组合任意多的对象,并将它们保存为一个列表。

2.8 常用函数

length(object) :显示对象中元素/成分的数量

## [1] 11
## [1] 32

dim(object): 显示某个对象的维度

## [1] 32 11

str(object) :显示某个对象的结构

## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

class(object): 显示某个对象的类或类型

## [1] "data.frame"

names(object):显示某对象中各成分的名称

##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"

c(object, object,…): 将对象合并入一个向量

## [1]  2 20

cbind(object, object, …): 按列合并对象

##      students math_score
## [1,] "A"      "100"     
## [2,] "B"      "80"      
## [3,] "C"      "70"      
## [4,] "D"      "95"

rbind(object, object, …): 按行合并对象

##            [,1]  [,2] [,3] [,4]
## students   "A"   "B"  "C"  "D" 
## math_score "100" "80" "70" "95"

head(object):列出某个对象的开始部分

##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

tail(object):列出某个对象的最后部分

##                 mpg cyl  disp  hp drat    wt qsec vs am gear carb
## Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.7  0  1    5    2
## Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
## Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.5  0  1    5    4
## Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.5  0  1    5    6
## Maserati Bora  15.0   8 301.0 335 3.54 3.570 14.6  0  1    5    8
## Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2

ls(): 显示当前的对象列表

##  [1] "a"               "b"               "c"              
##  [4] "d"               "english_score"   "excellence"     
##  [7] "lucky_numbers"   "math_score"      "my_character"   
## [10] "my_logical"      "my_numeric"      "my_var"         
## [13] "mylist"          "myMatrix"        "sex"            
## [16] "students"        "students_scores" "y"

rm(object, object, …): 删除一个或更多个对象。

##  [1] "d"               "english_score"   "excellence"     
##  [4] "lucky_numbers"   "math_score"      "my_character"   
##  [7] "my_logical"      "my_numeric"      "my_var"         
## [10] "mylist"          "myMatrix"        "sex"            
## [13] "students"        "students_scores" "y"

rm(list = ls()):将删除当前工作环境中的几乎所有对象4