
R 语言教程
概述
R 的简介
- R 语言是用于统计分析,图形表示和报告的编程语言和软件环境。R 语言由 Ross Ihaka 和 Robert Gentleman 在新西兰奥克兰大学创建,目前由 R 语言开发核心团队开发。
- R 语言的核心是解释计算机语言,其允许分支和循环以及使用函数的模块化编程。R 语言允许与以 C,C ++,.Net,Python 或 FORTRAN 语言编写的过程集成以提高效率。
- R 语言在 GNU 通用公共许可证下免费提供,并为各种操作系统(如 Linux,Windows 和 Mac)提供预编译的二进制版本。
- R 是一个在 GNU 风格的副本左侧的自由软件,GNU 项目的官方部分叫做 GNU S.
R 的演变
R 语言最初是由新西兰奥克兰奥克兰大学统计系的 Ross Ihaka 和 Robert Gentleman 写的。R 语言于 1993 年首次亮相。
- 一大群人通过发送代码和错误报告对 R 做出了贡献。
- 自 1997 年年中以来,已经有一个核心组(R 核心团队)可以修改 R 源代码归档。
R 的特点
如前所述,R 语言是用于统计分析,图形表示和报告的编程语言和软件环境。以下是 R 语言的重要特点:
- R 语言是一种开发良好,简单有效的编程语言,包括条件,循环,用户定义的递归函数以及输入和输出设施。
- R 语言具有有效的数据处理和存储设施,
- R 语言提供了一套用于数组,列表,向量和矩阵计算的运算符。
- R 语言为数据分析提供了大型,一致和集成的工具集合。
- R 语言提供直接在计算机上或在纸张上打印的图形设施用于数据分析和显示。
R 语言是世界上最广泛使用的统计编程语言。它是数据科学家的第一选择,并由一个充满活力和有才华的贡献者社区支持。
基本语法
根据需要,您可以在 R 语言命令提示符处编程,也可以使用 R 语言脚本文件编写程序。
命令提示符
如果你已经配置好 R 语言环境,那么你只需要按一下的命令便可轻易开启命令提示符
1 | R |
这将启动 R 语言解释器,你会得到一个提示 >
在那里你可以开始输入你的程序,具体如下。
1 | myString <- "Hello, World!" |
在这里,第一个语句先定义一个字符串变量 myString
,并将 Hello,World!
赋值其中,第二句则使用 print()
语句将变量 myString
的内容进行打印。
脚本文件
通常,您将通过在脚本文件中编写程序来执行编程,然后在命令提示符下使用 R 解释器(称为 Rscript
)来执行这些脚本。所以让我们开始在一个命名为 test.R
的文本文件中编写下面的代码
1 | My first program in R Programming |
将上述代码保存在 test.R
文件中,并在 Linux 命令提示符下执行,如下所示。即使您使用的是 Windows 或其他系统,语法也将保持不变。
1 | Rscript test.R |
当我们运行上面的程序,它产生以下结果:
1 | [1] "Hello, World!" |
注释
注释能帮助您解释 R 语言程序中的脚本,它们在实际执行程序时会被解释器忽略。单个注释使用 #
在语句的开头写入,如下所示
1 | # My first program in R Programming |
R 语言不支持多行注释,但你可以使用一个小技巧,如下
1 | if(FALSE) { |
虽然上面的注释将由 R 解释器执行,但它们不会干扰您的实际程序。但是你必须为内容加上单引号或双引号。
数据类型
通常,在使用任何编程语言进行编程时,您需要使用各种变量来存储各种信息。变量只是保留值的存储位置。这意味着,当你创建一个变量,你必须在内存中保留一些空间来存储它们。
您可能想存储各种数据类型的信息,如字符,宽字符,整数,浮点,双浮点,布尔等。基于变量的数据类型,操作系统分配内存并决定什么可以存储在保留内存中。
与其他编程语言(如 C 中的 C 和 Java)相反,变量不会声明为某种数据类型。变量分配有 R 对象,R 对象的数据类型变为变量的数据类型。尽管有很多类型的 R 对象,但经常使用的是:
这些对象中最简单的是向量对象,并且这些原子向量有六种数据类型,也称为六类向量。其他 R 对象建立在原子向量之上。
数据类型 | 取值 | 实例 |
---|---|---|
Logical(逻辑型) | TRUE, FALSE | v <- TRUE print(class(v)) [1] "logical" |
Numeric(数字) | 12.3,5,999 | v <- 23.5 print(class(v)) [1] "numeric" |
Integer(整型) | 2L,34L,0L | v <- 2L print(class(v)) [1] "integer" |
Complex(复合型) | 3 + 2i | v <- 2+5i print(class(v)) [1] "complex" |
Character(字符) | 'a' , "good", "TRUE", '23.4' | v <- "TRUE" print(class(v)) [1] "character" |
Raw(原型) | "Hello" 被存储为 48 65 6c 6c 6f | v <- charToRaw("Hello") print(class(v)) [1] "raw" |
在 R 编程中,非常基本的数据类型是称为向量的 R 对象,其保存如上所示的不同类的元素。请注意,在 R 中,类的数量不仅限于上述六种类型。例如,我们可以使用许多原子向量并创建一个数组,其类将成为数组。
Vectors 向量
当你想用多个元素创建向量时,你应该使用 c()
函数,这意味着将元素组合成一个向量。
1 | # Create a vector. |
更多方法实例请点击查看 R 语言向量章节。
Lists 列表
列表是一个 R 对象,它可以在其中包含许多不同类型的元素,如向量,函数甚至其中的另一个列表。
1 | # Create a list. |
更多方法实例请点击查看 R 语言列表章节。
Matrices 矩阵
矩阵是二维矩形数据集。它可以使用矩阵函数的向量输入创建。
1 | # Create a matrix. |
更多方法实例请点击查看 R 语言矩阵章节。
Arrays 数组
虽然矩阵被限制为二维,但阵列可以具有任何数量的维度。数组函数使用一个 dim
属性创建所需的维数。在下面的例子中,我们创建了一个包含两个元素的数组,每个元素为 3x3
个矩阵。
1 | # Create an array. |
更多方法实例请点击查看 R 语言数组章节。
Factors 因子
因子是使用向量创建的 R 对象。它将向量与向量中元素的不同值一起存储为标签。标签总是字符,不管它在输入向量中是数字还是字符或布尔等。它们在统计建模中非常有用。 使用 factor()
函数创建因子。nlevels
函数给出级别计数。
1 | # Create a vector. |
更多方法实例请点击查看 R 语言因子章节。
Data Frames 数据框
数据框是表格数据对象。与数据框中的矩阵不同,每列可以包含不同的数据模式。第一列可以是数字,而第二列可以是字符,第三列可以是逻辑的。它是等长度的向量的列表。 使用 data.frame()
函数创建数据框。
1 | # Create the data frame. |
更多方法实例请点击查看 R 语言数据框章节。
变量
变量为我们提供了我们的程序可以操作的命名存储。R 语言中的变量可以存储原子向量,原子向量组或许多 Robject
的组合。有效的变量名称由字母,数字和点或下划线字符组成。变量名以字母或不以数字后跟的点开头。
变量名 | 合法性 | 原因 |
---|---|---|
var_name2. | 有效 | 有字母,数字,点和下划线 |
VAR_NAME% | 无效 | 有字符'%'。只有点(.)和下划线允许的。 |
2var_name | 无效 | 以数字开头 |
.var_name, var.name | 有效 | 可以用一个点(.),但启动点(.),不应该后跟一个数字。 |
.2var_name | 无效 | 起始点后面是数字使其无效。 |
_var_name | 无效 | 开头_这是无效的 |
可以使用向左,向右和等于运算符来为变量分配值。可以使用 print()
或 cat()
函数打印变量的值。cat()
函数将多个项目组合成连续打印输出。
1 | # Assignment using equal operator. |
变量的数据类型 在 R 语言中,变量本身没有声明任何数据类型,而是获取分配给它的 R 对象的数据类型。所以 R 称为动态类型语言,这意味着我们可以在程序中使用同一个变量时,一次又一次地更改变量的数据类型。
1 | var_x <- "Hello" |
查找变量
要知道工作空间中当前可用的所有变量,我们使用 ls()
函数。ls()
函数也可以使用模式来匹配变量名。
1 | print(ls()) |
注意 :它是一个示例输出,取决于在您的环境中声明的变量。
ls()
函数可以使用模式来匹配变量名。
1 | # List the variables starting with the pattern "var". |
以点 .
开头的变量被隐藏,它们可以使用 ls()
函数的 all.names = TRUE
参数列出。
1 | print(ls(all.name = TRUE)) |
删除变量
可以使用 rm()
函数删除变量。下面我们删除变量 var.3
。打印时,抛出变量错误的值。
1 | rm(var.3) |
所有的变量可以通过使用 rm()
和 ls()
函数一起删除。
1 | rm(list = ls()) |
运算符
运算符是一个符号,通知编译器执行特定的数学或逻辑操作。R 语言具有丰富的内置运算符,并提供以下类型的运算符。
运算符的类型
R 语言中拥有如下几种运算符类型:
算术运算符
下表显示了 R 语言支持的算术运算符。操作符对向量的每个元素起作用。
运算符 | 描述 | 实例 |
---|---|---|
+ | 两个向量相加 | v <- c(2, 5.5, 6) t <- c(8, 3, 4) print(v+t) 它产生以下结果: [1] 10.0 8.5 10.0 |
- | 两个向量相减 | v <- c(2, 5.5, 6) t <- c(8, 3, 4) print(v-t) 它产生以下结果: [1] -6.0 2.5 2.0 |
* | 两个向量相乘 | v <- c(2, 5.5, 6) t <- c(8, 3, 4) print(v*t) 它产生以下结果: [1] 16.0 16.5 24.0 |
/ | 将第一个向量与第二个向量相除 | v <- c(2, 5.5, 6) t <- c(8, 3, 4) print(v/t) 它产生以下结果: [1] 0.250000 1.833333 1.500000 |
%% | 两个向量求余 | v <- c(2, 5.5, 6) t <- c(8, 3, 4) print(v%%t) 它产生以下结果: [1] 2.0 2.5 2.0 |
%/% | 两个向量相除求商 | v <- c(2, 5.5, 6) t <- c(8, 3, 4) print(v%/%t) 它产生以下结果: [1] 0 1 1 |
^ | 将第二向量作为第一向量的指数 | v <- c(2, 5.5, 6) t <- c(8, 3, 4) print(v^t) 它产生以下结果: [1] 256.000 166.375 1296.000 |
关系运算符
下表显示了 R 语言支持的关系运算符。将第一向量的每个元素与第二向量的相应元素进行比较。比较的结果是布尔值。
运算符 | 描述 | 实例 |
---|---|---|
> | 检查第一向量的每个元素是否大于第二向量的相应元素。 | v <- c(2, 5.5, 6, 9) t <- c(8, 2.5, 14, 9) print(v>t) 它产生以下结果: [1] FALSE TRUE FALSE FALSE |
< | 检查第一个向量的每个元素是否小于第二个向量的相应元素。 | v <- c(2, 5.5, 6, 9) t <- c(8, 2.5, 14, 9) print(v < t) 它产生以下结果: [1] TRUE FALSE TRUE FALSE |
== | 检查第一个向量的每个元素是否等于第二个向量的相应元素。 | v <- c(2, 5.5, 6, 9) t <- c(8, 2.5, 14, 9) print(v == t) 它产生以下结果: [1] FALSE FALSE FALSE TRUE |
<= | 检查第一向量的每个元素是否小于或等于第二向量的相应元素。 | v <- c(2, 5.5, 6, 9) t <- c(8, 2.5, 14, 9) print(v<=t) 它产生以下结果: [1] TRUE FALSE TRUE TRUE |
>= | 检查第一向量的每个元素是否大于或等于第二向量的相应元素。 | v <- c(2, 5.5, 6, 9) t <- c(8, 2.5, 14, 9) print(v>=t) 它产生以下结果: [1] FALSE TRUE FALSE TRUE |
!= | 检查第一个向量的每个元素是否不等于第二个向量的相应元素。 | v <- c(2, 5.5, 6, 9 t <- c(8, 2.5, 14, 9) print(v!=t) 它产生以下结果: [1] TRUE TRUE TRUE FALSE |
逻辑运算符
下表显示了 R 语言支持的逻辑运算符。它只适用于逻辑,数字或复杂类型的向量。所有大于 1 的数字被认为是逻辑值 TRUE
。
将第一向量的每个元素与第二向量的相应元素进行比较。比较的结果是布尔值。
运算符 | 描述 | 实例 |
---|---|---|
& | 它被称为元素逻辑 AND 运算符。 它将第一向量的每个元素与第二向量的相应元素组合, 并且如果两个元素都为 TRUE,则给出输出 TRUE。 | v <- c(3, 1, TRUE, 2+3i) t <- c(4, 1, FALSE, 2+3i) print(v&t) 它产生以下结果: [1] TRUE TRUE FALSE TRUE |
&vert; | 它被称为元素逻辑或运算符。 它将第一向量的每个元素与第二向量的相应元素组合, 并且如果元素为真,则给出输出 TRUE。 | v <- c(3, 0, TRUE, 2+2i) t <- c(4, 0, FALSE, 2+3i) print(v |t) 它产生以下结果: [1] TRUE FALSE TRUE TRUE |
! | 它被称为逻辑非运算符。取得向量的每个元素,并给出相反的逻辑值。 | v <- c(3, 0, TRUE, 2+2i) print(!v) 它产生以下结果: [1] FALSE TRUE FALSE FALSE |
逻辑运算符 &&
和 ||
只考虑向量的第一个元素,给出单个元素的向量作为输出。
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑 AND 运算符。取两个向量的第一个元素, 并且只有两个都为 TRUE 时才给出 TRUE。 | v <- c(3, 0, TRUE, 2+2i) t <- c(1, 3, TRUE, 2+3i) print(v&&t) 它产生以下结果: [1] TRUE |
|&vert; | 称为逻辑 OR 运算符。取两个向量的第一个元素, 如果其中一个为 TRUE,则给出 TRUE。 | v <- c(0, 0, TRUE, 2+2i) t <- c(0, 3, TRUE, 2+3i) print(v ||t) 它产生以下结果: [1] FALSE |
赋值运算符
这些运算符用于向向量赋值。
运算符 | 描述 | 实例 |
---|---|---|
<− = <<− | 称为左分配 | v1 <- c(3, 1, TRUE, 2+3i) v2 <<- c(3, 1, TRUE, 2+3i) v3 = c(3, 1, TRUE, 2+3i) print(v1) print(v2) print(v3) 它产生以下结果: [1] 3+0i 1+0i 1+0i 2+3i [1] 3+0i 1+0i 1+0i 2+3i [1] 3+0i 1+0i 1+0i 2+3i |
-> ->> | 称为右分配 | c(3, 1, TRUE, 2+3i) -> v1 c(3, 1, TRUE, 2+3i) ->> v2 print(v1) print(v2) 它产生以下结果: [1] 3+0i 1+0i 1+0i 2+3i [1] 3+0i 1+0i 1+0i 2+3i |
其他运算符
这些运算符用于特定目的,而不是一般的数学或逻辑计算。
运算符 | 描述 | 实例 |
---|---|---|
: | 冒号运算符。它为向量按顺序创建一系列数字。 | v <- 2:8 print(v) 它产生以下结果: [1] 2 3 4 5 6 7 8 |
%in% | 此运算符用于标识元素是否属于向量。 | v1 <- 8 v2 <- 12 t <- 1:10 print(v1 %in% t) print(v2 %in% t) 它产生以下结果: [1] TRUE [1] FALSE |
%*% | 此运算符用于将矩阵与其转置相乘。 | M = matrix(c(2, 6, 5, 1, 10, 4), nrow = 2, ncol = 3, byrow = TRUE) t = M %*% t(M) print(t) 它产生以下结果: [,1] [,2] [1,] 65 82 [2,] 82 117 |
包
R 语言的包是 R 函数,编译代码和样本数据的集合。它们存储在 R 语言环境中名为 library
的目录下。默认情况下,R 语言在安装期间安装一组软件包。随后添加更多包,当它们用于某些特定目的时。当我们启动 R 语言控制台时,默认情况下只有默认包可用。已经安装的其他软件包必须显式加载以供将要使用它们的 R 语言程序使用。
所有可用的 R 语言包都列在 R 语言的包。
下面是用于检查,验证和使用 R 包的命令列表。
检查可用 R 语言的包
获取包含 R 包的库位置
1 | .libPaths() |
获取已安装的所有软件包列表
1 | library() |
获取当前在 R 环境中加载的所有包
1 | search() |
安装一个新的软件包
有两种方法来添加新的 R 包。一个是直接从 CRAN 目录安装,另一个是将软件包下载到本地系统并手动安装它。
直接从 CRAN 安装
以下命令直接从 CRAN 网页获取软件包,并将软件包安装在 R 环境中。可能会提示您选择最近的镜像。根据您的位置选择一个。
1 | install.packages("Package Name") |
手动安装包
转到链接 R Packages 下载所需的包。将包作为 .zip 文件保存在本地系统中的适当位置。
现在您可以运行以下命令在 R 环境中安装此软件包。
1 | install.packages(file_name_with_path, repos = NULL, type = "source") |
装载包到库中
在包可以在代码中使用之前,必须将其加载到当前 R 环境中。您还需要加载先前已安装但在当前环境中不可用的软件包。
使用以下命令加载包:
1 | library("package Name", lib.loc = "path to library") |
决策
决策结构要求程序员指定要由程序评估或测试的一个或多个条件,以及如果条件被确定为真则要执行的一个或多个语句,如果条件为假则执行其他语句。
R 提供以下类型的决策语句。
- if 语句
- if ... else 语句
- switch 语句
if 语句
if 语句由一个布尔表达式后跟一个或多个语句组成。
语法
在 R 中创建 if
语句的基本语法是:
1 | if(boolean_expression) { |
如果布尔表达式的计算结果为 true
,那么 if
语句中的代码块将被执行。如果布尔表达式的计算结果为 false
,那么第一组代码在 if 语句结束之后(在结束大括号之后)将被执行。
流程图
实例
1 | x <- 30L |
if...else 语句
if
语句后面可以是一个可选的 else
语句,当布尔表达式为 false
时执行。
语法
在 R 中创建 if ... else 语句的基本语法是:
1 | if(boolean_expression) { |
如果布尔表达式的计算结果为真,则将执行 if 代码块,否则将执行代码块。
流程图
实例
1 | x <- c("what", "is", "truth") |
这里 Truth
和 truth
是两个不同的字符串。
if ... else if ... else 语句
if
语句后面可以跟一个可选的 else if ... else
语句,这对于使用 single if ... else if
语句测试各种条件非常有用。
当使用 if
,else if
,else
语句有几点要记住:
- 如果可以有零个或一个
else
,它必须在任何其他if
之后。 - 一个
if
可以有零个到许多个else if
和它们必须在else
之前。 - 一旦一个
else
如果成功,没有任何剩余的else if
或else
将被测试。
语法
在 R 中创建 if ... else if ... else
语句的基本语法是:
1 | if(boolean_expression 1) { |
实例
1 | x <- c("what", "is", "truth") |
switch 语句
switch
语句允许根据值列表测试变量的相等性。每个值都称为大小写,并且针对每种情况检查打开的变量。
语法
在 R 中创建 switch
语句的基本语法是:
1 | switch(expression, case1, case2, case3....) |
以下规则适用于 switch
语句:
- 如果
expression
的值不是字符串,那么它被强制为整数。 - 在交换机中可以有任意数量的
case
语句。每个案例后面都跟要比较的值和冒号。 - 如果整数的值在
1
和 nargs() - 1
(参数的最大数目)之间,则对 case 条件的相应元素求值并返回结果。 - 如果表达式求值为字符串,那么该字符串与元素的名称匹配。
- 如果有多个匹配,则返回第一个匹配元素。
- 无默认参数可用。
- 在没有匹配的情况下,如果有一个未命名的元素...它的值被返回。(如果有多个这样的参数,则返回错误。)
流程图
实例 1
1 | x <- switch( |
实例 2
runif()
函数用于生成从 0
到 1
区间范围内的服从正态分布的随机数:
1 | switch(1, 2*3, sd(1:5), runif(3)) #返回 (2*3, sd(1:5), runif(3)) list 中的第一个成分 |
循环
可能有一种情况,当你需要执行一段代码几次。通常,顺序执行语句。首先执行函数中的第一个语句,然后执行第二个语句,依此类推。
编程语言提供允许更复杂的执行路径的各种控制结构。
循环语句允许我们多次执行一个语句或一组语句,以下是大多数编程语言中循环语句的一般形式
循环控制语句
循环控制语句从其正常序列改变执行。当执行离开作用域时,在该作用域中创建的所有自动对象都将被销毁。
R 语言支持以下控制语句。
- break
- next
Repeat 语句
repeat
循环重复执行相同的代码,直到满足停止条件。
语法
在 R 中创建 Repeat 循环的基本语法是:
1 | repeat { |
流程图
实例
1 | v <- c("Hello", "loop") |
while 语句
while
循环一次又一次地执行相同的代码,直到满足停止条件。
语法
在 R 中创建 while
循环的基本语法是:
1 | while (test_expression) { |
流程图
while
循环的关键点是循环可能永远不会运行。当条件被测试并且结果为 false
时,循环体将被跳过,while
循环之后的第一条语句将被执行。
实例
1 | v <- c("Hello","while loop") |
for 语句
for
循环是一种重复控制结构,允许您有效地编写需要执行特定次数的循环。
R 的 for
循环是特别灵活的,因为它们不限于整数,或者输入中的偶数。我们可以传递字符向量,逻辑向量,列表或表达式。
语法
在 R 中创建一个 for
循环语句的基本语法是:
1 | for (变量 in 条件) { |
流程图
实例
1 | v <- LETTERS[1:4] |
break 语句
R 语言中的 break
语句有以下两种用法:
当在循环中遇到 break
语句时,循环立即终止,并且程序控制在循环之后的下一语句处恢复。 它可以用于终止 switch
语句中的情况。 语法 在 R 中创建 break
语句的基本语法是:
1 | break |
流程图
实例
1 | v <- c("Hello","loop") |
next 语句
R 语言存在 next
语句,当我们想跳过循环的当前迭代而不终止它时便可使用 next
。遇到 next
时,R 解析器跳过本次迭代,并开始循环的下一次迭代。
语法
在 R 中创建 next
语句的基本语法是:
1 | next |
流程图
实例
1 | v <- LETTERS[1:6] |
数据重塑
R 语言中的数据重塑是关于改变数据被组织成行和列的方式。
大多数时间 R 语言中的数据处理是通过将输入数据作为数据框来完成的。很容易从数据框的行和列中提取数据,但是在某些情况下,我们需要的数据框格式与我们接收数据框的格式不同。R 语言具有许多函数,可以在数据框中拆分,合并和将行更改为列,反之亦然。
数据框中加入列和行
我们可以使用 cbind()
函数连接多个向量来创建数据框。此外,我们可以使用 rbind()
函数合并两个数据框。
1 | # Create vector objects. |
合并数据框
我们可以使用 merge()
函数合并两个数据框。数据框必须具有相同的列名称,在其上进行合并。
在下面的例子中,我们考虑使用 library()
函数加载 MASS
第三方包,使用 MASS
中有关 Pima Indian Women
的糖尿病的数据集。我们基于血压(bp)和体重指数(bmi)的值合并两个数据集。在选择这两列用于合并时,其中这两个变量的值在两个数据集中匹配的记录被组合在一起以形成单个数据框。
1 | library(MASS) |
有时,电子表格数据的格式很紧凑,可以给出每个主题的协变量,然后是该主题的所有观测值。R 的建函数需要在单个列中进行观察。考虑以下来自重复 MRI
脑测量的数据样本:
1 | Status Age V1 V2 V3 V4 |
在每个主题上有两个协变量和多达四个测量值。数据从 Excel 导出为 mr.csv
文件。
我们可以使用堆栈来帮助操纵这些数据以给出单个响应。
1 | zz <- read.csv("mr.csv", strip.white = TRUE) |
函数 unstack
的方向相反,可能对导出数据很有用。
另一种方法是使用函数重塑
1 | reshape(zz, idvar="id", timevar="var", varying=list(c("V1", "V2", "V3", "V4")), direction="long") |
重塑函数的语法比堆栈更复杂,但可以用于 long
表单中不止一列的数据。如果 direction="width"
,重塑还可以执行相反的转换。
函数
函数是一组组合在一起以执行特定任务的语句。R 语言具有大量内置函数,用户可以创建自己的函数。
在 R 语言中,函数是一个对象,因此 R 语言解释器能够将控制传递给函数,以及函数完成动作所需的参数。
该函数依次执行其任务并将控制返回到解释器以及可以存储在其他对象中的任何结果。
函数定义
使用关键字函数创建 R 语言的函数。R 语言的函数定义的基本语法如下
1 | function_name <- function(arg_1, arg_2, ...) { |
函数组件
函数的不同部分:
- 函数名称:这是函数的实际名称。它作为具有此名称的对象存储在 R 环境中。
- 参数:参数是一个占位符。当函数被调用时,你传递一个值到参数。参数是可选的,也就是说,一个函数可能不包含参数。参数也可以有默认值。
- 函数体:函数体包含定义函数的语句集合。
- 返回值:函数的返回值是要评估的函数体中的最后一个表达式。
R 语言有许多内置函数,可以在程序中直接调用而无需先定义它们。我们还可以创建和使用我们自己的函数,称为用户定义的函数。
内置函数
内置函数的简单示例是 seq()
,mean()
,max()
,sum(x)
和 paste(...)
等。它们由用户编写的程序直接调用。您可以参考最广泛使用的 R 函数。
1 | # Create a sequence of numbers from 32 to 44. |
用户定义的函数
我们可以在 R 语言中创建用户定义的函数。它们特定于用户想要的,一旦创建,它们就可以像内置函数一样使用。下面是一个创建和使用函数的例子。
1 | # Create a function to print squares of numbers in sequence. |
调用函数
1 | # Create a function to print squares of numbers in sequence. |
调用没有参数的函数
1 | # Create a function without an argument. |
使用参数值调用函数(按位置和名称)
函数调用的参数可以按照函数中定义的顺序提供,也可以以不同的顺序提供,但分配给参数的名称。
1 | # Create a function with arguments. |
使用默认参数调用函数
我们可以在函数定义中定义参数的值,并调用函数而不提供任何参数以获取默认结果。但是我们也可以通过提供参数的新值来获得非默认结果来调用这样的函数。
1 | # Create a function with arguments. |
函数的延迟计算
对函数的参数进行延迟评估,这意味着它们只有在函数体需要时才进行评估。
1 | # Create a function with arguments. |
字符串
在 R 语言中的单引号或双引号对中写入的任何值都被视为字符串。R 语言存储的每个字符串都在双引号内,即使是使用单引号创建的依旧如此。
字符串构造规则
在字符串的开头和结尾的引号应该是两个双引号或两个单引号。它们不能被混合。
- 双引号可以插入以单引号开头和结尾的字符串中。
- 单引号可以插入以双引号开头和结尾的字符串中。
- 双引号不能插入以双引号开头和结尾的字符串中。
- 单引号不能插入以单引号开头和结尾的字符串中。
有效字符串的示例
以下示例阐明了在 R 语言中创建字符串的规则。
1 | a <- 'Start and end with single quote' |
无效字符串的示例
1 | e <- 'Mixed quotes" |
字符串操作
连接字符串
R 语言中的许多字符串使用 paste()
函数组合。它可以采取任何数量的参数组合在一起。
语法
函数的基本语法是:
1 | paste(..., sep = " ", collapse = NULL) |
以下是所使用的参数的说明:
...
表示要组合的任意数量的自变量。sep
表示参数之间的任何分隔符。它是可选的。collapse
用于消除两个字符串之间的空格。但不是一个字符串的两个字内的空间。
实例
1 | a <- "Hello" |
格式化数字和字符串
可以使用 format()
函数将数字和字符串格式化为特定样式。
语法
函数的基本语法是:
1 | format(x, digits, nsmall, scientific, width, justify = c("left", "right", "centre", "none")) |
以下是所使用的参数的说明:
x
是向量输入。digits
是显示的总位数。nsmall
是小数点右边的最小位数。scientific
设置为TRUE
以科学记数法显示。width
指示通过在开始处填充空白来显示的最小宽度。justify
是字符串向左,右或中心的显示。
实例
1 | # Total number of digits displayed. Last digit rounded off. |
计算字符串中的字符数
nchar()
函数可以计算字符串中包含空格的字符数。
语法
函数的基本语法是:
1 | nchar(x) |
以下是所使用的参数的说明:
x
是向量输入。
实例
1 | result <- nchar("Count the number of characters") |
更改大小写
使用 toupper()
和 tolower()
函数可以改变字符串的字符的大小写。
语法
函数的基本语法是:
1 | toupper(x) |
以下是所使用的参数的说明:
x
是向量输入。
实例
1 | # Changing to Upper case. |
提取字符串
substring()
函数可以用于提取字符串的部分。
语法
函数的基本语法是:
1 | substring(x, first, last) |
以下是所使用的参数的说明:
x
是字符向量输入。first
是要提取的第一个字符的位置。last
是要提取的最后一个字符的位置。
实例
1 | # Extract characters from 5th to 7th position. |
向量
向量是最基本的 R 语言数据对象,有六种类型的原子向量。它们是逻辑,整数,双精度,复杂,字符和原始。
创建向量
单元素向量
即使在 R 语言中只写入一个值,它也将成为长度为 1
的向量,并且属于上述向量类型之一。
1 | # Atomic vector of type character. |
多元素向量
对数值数据使用冒号运算符
1 | # Creating a sequence from 5 to 13. |
使用 sequence (Seq.)
序列运算符
1 | # Create vector with elements from 5 to 9 incrementing by 0.4. |
使用 C()
函数
如果其中一个元素是字符,则非字符值被强制转换为字符类型。
1 | # The logical and numeric values are converted to characters. |
访问向量元素
使用索引访问向量的元素。[]
括号用于建立索引。索引从位置 1
开始。在索引中给出负值会丢弃,TRUE
,FALSE
或 0
和 1
的元素,也可用于索引。
1 | # Accessing vector elements using position. |
向量操作
向量运算
可以加,减,乘,除两个相同长度的向量,将结果作为向量输出。
1 | # Create two vectors. |
向量元素回收
如果我们对不等长的两个向量应用算术运算,则较短向量的元素被循环以完成操作。
1 | v1 <- c(3, 8, 4, 5, 0, 11) |
向量元素排序
向量中的元素可以使用 sort()
函数排序。
1 | v <- c(3, 8, 4, 5, 0, 11, -9, 304) |
列表
列表是 R 语言对象,它包含不同类型的元素,如数字,字符串,向量和其中的另一个列表。列表还可以包含矩阵或函数作为其元素。列表是使用 list()
函数创建的。
创建列表
以下是创建包含字符串,数字,向量和逻辑值的列表的示例
1 | # Create a list containing strings, numbers, vectors and a logical values. |
命名列表元素
列表元素可以给出名称,并且可以使用这些名称访问它们。
1 | # Create a list containing a vector, a matrix and a list. |
访问列表元素
列表的元素可以通过列表中元素的索引访问。在命名列表的情况下,它也可以使用名称来访问。
我们继续使用在上面的例子:
1 | # Create a list containing a vector, a matrix and a list. |
操作列表元素
我们可以添加,删除和更新列表元素,如下所示。我们只能在列表的末尾添加和删除元素。但我们可以更新任何元素。
1 | # Create a list containing a vector, a matrix and a list. |
合并列表
通过将所有列表放在一个 list()
函数中,您可以将许多列表合并到一个列表中。
1 | # Create two lists. |
将列表转换为向量
列表可以转换为向量,使得向量的元素可以用于进一步的操作。可以在将列表转换为向量之后应用对向量的所有算术运算。我们可以使用 unlist()
函数完成这个转换。它将列表作为输入并生成向量。
1 | # Create lists. |
矩阵
矩阵是其中元素以二维矩形布局布置的 R 对象。它们包含相同原子类型的元素。虽然我们可以创建一个只包含字符或只包含逻辑值的矩阵,但它们没有太多用处。我们使用包含数字元素的矩阵用于数学计算。
创建矩阵
R 语言中使用 matrix()
函数创建一个矩阵。
语法
在 R 语言中创建矩阵的基本语法是:
1 | matrix(data, nrow, ncol, byrow, dimnames) |
以下是所使用的参数的说明:
data
是成为矩阵的数据元素的输入向量。nrow
是要创建的行数。ncol
是要创建的列数。byrow
是一个逻辑线索。如果为TRUE
,则输入向量元素按行排列。dimname
是分配给行和列的名称。
实例
创建一个以数字向量作为输入的矩阵
1 | # Elements are arranged sequentially by row. |
访问矩阵的元素
可以通过使用元素的列和行索引来访问矩阵的元素。我们考虑上面的矩阵 P
找到下面的具体元素。
1 | # Define the column and row names. |
矩阵计算
使用 R 运算符对矩阵执行各种数学运算。操作的结果也是一个矩阵。
对于操作中涉及的矩阵,维度(行数和列数)应该相同。
加法和减法
1 | # Create two 2x3 matrices. |
乘法和除法
1 | # Create two 2x3 matrices. |
数组
数组是可以在两个以上维度中存储数据的 R 数据对象。
例如:如果我们创建一个维度 (2,3,4)
的数组,则它创建 4
个矩形矩阵,每个矩阵具有 2
行和 3
列。数组只能存储数据类型。
创建数组
使用 array()
函数创建数组。它使用向量作为输入,并使用 dim
参数中的值创建数组。
实例
以下示例创建一个由两个 3x3
矩阵组成的数组,每个矩阵具有 3
行和 3
列。
1 | # Create two vectors of different lengths. |
命名列和行
我们可以使用 dimnames
参数给数组中的行,列和矩阵命名。
1 | # Create two vectors of different lengths. |
访问数组元素
1 | # Create two vectors of different lengths. |
操作数组元素
由于数组由多维构成矩阵,所以对数组元素的操作通过访问矩阵的元素来执行。
1 | # Create two vectors of different lengths. |
跨数组元素的计算
我们可以使用 apply()
函数在数组中的元素上进行计算。
语法
1 | apply(x, margin, fun) |
以下是所使用的参数的说明:
x
是一个数组。margin
是所使用的数据集的名称。fun
是要应用于数组元素的函数。
实例
我们下面使用 apply()
函数计算所有矩阵中数组行中元素的总和。
1 | # Create two vectors of different lengths. |
因子
因子是用于对数据进行分类并将其存储为级别的数据对象。它们可以存储字符串和整数。它们在具有有限数量的唯一值的列中很有用。像 男性
,女性
和 True
,False
等。它们在统计建模的数据分析中很有用。
创建因子
使用 factor()
函数通过将向量作为输入创建因子。
实例
1 | # Create a vector as input. |
数据框的因子
在创建具有文本数据列的任何数据框时,R 语言将文本列视为分类数据并在其上创建因子。
1 | # Create the vectors for data frame. |
更改级别顺序
可以通过使用新的等级次序再次应用因子函数来改变因子中的等级的顺序。
1 | data <- c("East", "West", "East", "North", "North", "East", "West", "West", "West", "East", "North") |
生成因子级别
我们可以使用 gl()
函数生成因子级别。它需要两个整数作为输入,指示每个级别有多少级别和多少次。
语法
1 | gl(n, k, labels) |
以下是所使用的参数的说明:
n
是给出级数的整数。k
是给出复制数目的整数。labels
是所得因子水平的标签向量。
实例
1 | v <- gl(3, 4, labels = c("Tampa", "Seattle", "Boston")) |
数据框
数据框是表或二维阵列状结构,其中每一列包含一个变量的值,并且每一行包含来自每一列的一组值。
以下是数据框的特性。
- 列名称应为非空。
- 行名称应该是唯一的。
- 存储在数据框中的数据可以是数字,因子或字符类型。
- 每个列应包含相同数量的数据项。
创建数据框
1 | # Create the data frame. |
获取数据框的结构
通过使用 str()
函数可以看到数据框的结构。
1 | # Create the data frame. |
数据框中的数据摘要
可以通过应用 summary()
函数获取数据的统计摘要和性质。
1 | # Create the data frame. |
从数据框提取数据
使用列名称从数据框中提取特定列。
1 | # Create the data frame. |
先提取前两行,然后提取所有列
1 | # Create the data frame. |
提取第 2 列和第 4 列,第 3 行和第 5 行
1 | # Create the data frame. |
扩展数据框
可以通过添加列和行来扩展数据框。
添加列
只需使用新的列名称添加列向量。
1 | # Create the data frame. |
添加行
要将更多行永久添加到现有数据框,我们需要引入与现有数据框相同结构的新行,并使用 rbind()
函数。
在下面的示例中,我们创建一个包含新行的数据框,并将其与现有数据框合并以创建最终数据框。
1 | # Create the first data frame. |
自带数据集
使用以下命令可以查询 R 语言自带的数据集:
1 | data() |
向量数据集
数据集 | 内容 |
---|---|
euro | 欧元汇率,长度为 11,每个元素都有命名 |
landmasses | 48 个陆地的面积,每个都有命名 |
precip | 长度为 70 的命名向量 |
rivers | 北美 141 条河流长度 |
state.abb | 美国 50 个州的双字母缩写 |
state.area | 美国 50 个州的面积 |
state.name | 美国 50 个州的全称 |
因子数据集
数据集 | 内容 |
---|---|
state.division | 美国 50 个州的分类,9 个类别 |
state.region | 美国 50 个州的地理分类 |
矩阵、数组数据集
数据集 | 内容 |
---|---|
euro.cross | 11 种货币的汇率矩阵 |
freeny | 每个季度影响收入四个因素的记录 |
state.x77 | 美国 50 个州的八个指标 |
USPersonalExpenditure | 5 个年份在 5 个消费方向的数据 |
VADeaths | 1940 年弗吉尼亚州死亡率(每千人) |
volcano | 某火山区的地理信息(10 米 × 10 米的网格) |
WorldPhones | 8 个区域在 7 个年份的电话总数 |
iris3 | 3 种鸢尾花形态数据 |
Titanic | 泰坦尼克乘员统计 |
UCBAdmissions | 伯克利分校 1973 年院系、录取和性别的频数 |
crimtab | 3000 个男性罪犯左手中指长度和身高关系 |
HairEyeColor | 592 人头发颜色、眼睛颜色和性别的频数 |
occupationalStatus | 英国男性父子职业联系 |
类矩阵数据集
数据集 | 内容 |
---|---|
eurodist | 欧洲 12 个城市的距离矩阵,只有下三角部分 |
Harman23.cor | 305 个女孩 8 个形态指标的相关系数矩阵 |
Harman74.cor | 145 个儿童 24 个心理指标的相关系数矩阵 |
数据框数据集
数据集 | 内容 |
---|---|
airquality | 纽约 1973 年 5-9 月每日空气质量 |
anscombe | 四组 x-y 数据,虽有相似的统计量,但实际数据差别较大 |
attenu | 多个观测站对加利福尼亚 23 次地震的观测数据 |
attitude | 30 个部门在七个方面的调查结果,调查结果是同一部门 35 个职员赞成的百分比 |
beaver1 | 一只海狸每 10 分钟的体温数据,共 114 条数据 |
beaver2 | 另一只海狸每 10 分钟的体温数据,共 100 条数据 |
BOD | 随水质的提高,生化反应对氧的需求(mg/l)随时间(天)的变化 |
cars | 1920 年代汽车速度对刹车距离的影响 |
chickwts | 不同饮食种类对小鸡生长速度的影响 |
esoph | 法国的一个食管癌病例对照研究 |
faithful | 一个间歇泉的爆发时间和持续时间 |
Formaldehyde | 两种方法测定甲醛浓度时分光光度计的读数 |
Freeny | 每季度收入和其他四因素的记录 |
dating from | 配对的病例对照数据,用于条件 logistic 回归 |
InsectSprays | 使用不同杀虫剂时昆虫数目 |
iris | 3 种鸢尾花形态数据 |
LifeCycleSavings | 50 个国家的存款率 |
longley | 强共线性的宏观经济数据 |
morley | 光速测量试验数据 |
mtcars | 32 辆汽车在 11 个指标上的数据 |
OrchardSprays | 使用拉丁方设计研究不同喷雾剂对蜜蜂的影响 |
PlantGrowth | 三种处理方式对植物产量的影响 |
pressure | 温度和气压 |
Puromycin | 两种细胞中辅因子浓度对酶促反应的影响 |
quakes | 1000 次地震观测数据(震级 4) |
randu | 使用 FORTRAN 中的 RANDU 三个一组生成随机数字,共 400 组。 |
rock | 48 块石头的形态数据 |
sleep | 两药物的催眠效果 |
stackloss | 化工厂将氨转为硝酸的数据 |
swiss | 瑞士生育率和社会经济指标 |
ToothGrowth | VC 剂量和摄入方式对豚鼠牙齿的影响 |
trees | 树木形态指标 |
USArrests | 美国 50 个州的四个犯罪率指标 |
USJudgeRatings | 43 名律师的 12 个评价指标 |
warpbreaks | 织布机异常数据 |
women | 15 名女性的身高和体重 |
列表数据集
数据集 | 内容 |
---|---|
state.center | 美国 50 个州中心的经度和纬度 |
类数据框数据集
数据集 | 内容 |
---|---|
ChickWeight | 饮食对鸡生长的影响 |
CO2 | 耐寒植物 CO2 摄取的差异 |
DNase | 若干次试验中,DNase 浓度和光密度的关系 |
Indometh | 某药物的药物动力学数据 |
Loblolly | 火炬松的高度、年龄和种源 |
Orange | 桔子树生长数据 |
Theoph | 茶碱药动学数据 |
时间序列数据集
数据集 | 内容 |
---|---|
airmiles | 美国 1937-1960 年客运里程营收(实际售出机位乘以飞行哩数) |
AirPassengers | Box & Jenkins 航空公司 1949-1960 年每月国际航线乘客数 |
austres | 澳大利亚 1971-1994 每季度人口数(以千为单位) |
BJsales | 有关销售的一个时间序列 |
BJsales.lead | 前一指标的先行指标(leading indicator) |
co2 | 1959-1997 年每月大气 co2 浓度(ppm) |
discoveries | 1860-1959 年每年巨大发现或发明的个数 |
ldeaths | 1974-1979 年英国每月支气管炎、肺气肿和哮喘的死亡率 |
fdeaths | 前述死亡率的女性部分 |
mdeaths | 前述死亡率的男性部分 |
freeny.y | 每季度收入 |
JohnsonJohnson | 1960-1980 年每季度 Johnson & Johnson 股票的红利 |
LakeHuron | 1875-1972 年某一湖泊水位的记录 |
lh | 黄体生成素水平,10 分钟测量一次 |
lynx | 1821-1934 年加拿大猞猁数据 |
nhtemp | 1912-1971 年每年平均温度 |
Nile | 1871-1970 尼罗河流量 |
nottem | 1920-1939 每月大气温度 |
presidents | 1945-1974 年每季度美国总统支持率 |
UKDriverDeaths | 1969-1984 年每月英国司机死亡或严重伤害的数目 |
sunspot.month | 1749-1997 每月太阳黑子数 |
sunspot.year | 1700-1988 每年太阳黑子数 |
sunspots | 1749-1983 每月太阳黑子数 |
treering | 归一化的树木年轮数据 |
UKgas | 1960-1986 每月英国天然气消耗 |
USAccDeaths | 1973-1978 美国每月意外死亡人数 |
uspop | 1790–1970 美国每十年一次的人口总数(百万为单位) |
WWWusage | 每分钟网络连接数 |
Seatbelts | 多变量时间序列。和 UKDriverDeaths 时间段相同,反映更多因素。 |
EuStockMarkets | 多变量时间序列。欧洲股市四个主要指标的每个工作日记录,共 1860 条记录。 |