【R语言】基础知识
R 语言是一门动态弱类型的语言,同时作为一种解释型程序语言,它具有面向对象编程和函数式编程两种编程范式。
其中面向对象的部分中,将对象作为存储单位,用以存储变量值,存储函数内容,存储字符内容等。 如果在命令行中进行交互时输入对象所相关的变量名,会返回对象内存储的内容。 当调用函数时,需要使用 $lambda$ 表达式的方式。
面向对象编程的思想下,每个对象都有其相应的属性,大部分属性是普适的,也有特殊的属性值。
{% asset_img “oop.png” %}
注意:
- R里最基础的数据元素不是标量,是向量,所有数据传入变量时均转换为向量组成。
- 在查看对象的类型时,对于单向量对象,返回每个元素的数据类型;对于向量之外的对象,返回数据结构。
函数式编程的部分则将函数作为编程的主体,对将函数和环境作为编程考虑的因素。 函数式编程中,函数是一等公民,或者说将函数看作一种对象,可以将函数作为参数传递给高阶函数,并且高阶函数可以将函数作为一个返回值。
1. 数据类型
R
中变量的声明通常为
变量名命名有一些基本原则:
- 必须字母开头。
- 可包含字母、数字、
_
、.
。 - ==区分大小写==。
- 不能使用关键字,最好不
- 不能以特殊字符开头,最好不
- 不能以数字开头,最好不
之所以用最好不,是因为在是在迫不得已的时候,可以用
"'
和反引号来包裹变量名,从而把他们作为变量名,但是使用的时候也得这样用。
常量或称字面量,即编程实践中的值。 数据类型,即字面量类型。根据数据结构复杂程度可以分为,基本类型和复合类型。
1.1. 基本类型
通过 mode() typeof()
获得
- 字符型(character):
"a", 'a'
- 数值型(numeric)
- 整数(integer):
1L
- 浮点数(double):
3.14
- 复数型(complex):
- 整数(integer):
- 逻辑型(logical):
TRUE
- 原生型(raw):
有些时候 R 会自动进行类型之间的转换,此时遵循类型转换优先级进行:
- 字符型
- 浮点型
- 整型
- 逻辑型
1.2. 复合类型
1.2.1. 标量(Scalar)
只储存仅有一个变量的对象,R中现实不存在
1.2.2. 向量(vector)
存储多个标量,但是类型统一,有一维和多维向量。
注意:
- ==索引不从0开始,而是从1开始==
- 索引0用以规避NA
- 除了用索引,向量每个元素也可以有
names
- 对于拥有不同类型的向量合并时,会自动进行类型转换
矩阵(matrix)
每个元素都拥有相同的数据类型(数值型、字符型或逻辑型),==是维度属性为 2 的向量==。在 R 中是一种相对原始的数据结构。
|
|
注意:
- 使用
matrix[1]
,取得是一个值(按照列进行逐列排序的) - 行名和列名不在任意行和列中
- 不支持使用
$
取子集 - 如果使用
names()
来进行列名操作,结果会发现,这个列名与你所预期的列名不一致,它是每一个元素自左上逐列进行排序的命名
数组(array)
==维度属性>2的向量,每个元素(g)只能有一种数据类型,不同元素的类型可以不同==。
|
|
注意:
- 行名和列名不在任意行和列中
因子(factor)
用于对数据进行自动分组,自动上色,==分类变量==。
==因子是带有水平(level)属性的向量,是一类分类离散变量==。
由于拥有 class
属性,它也是 S3
对象。
{% asset_img “facters.png” %}
|
|
时间序列(ts)
包含 Date
Date-times
和 Durations
,都是 S3
类
🧐还没研究。。。
1.2.3. 列表(list)
可包含所有的数据结构,数据框的子集是以列表的方式呈现。
每一个元素都是一个指针,指向对应元素的内存地址。从某种意义上来讲,列表也是一种向量。
注意:
- 列表并不会展平整个数据结构,这点与向量是不同的
unlist()
虽然可以展平一个列表,但是结果并不一定会如你预期,所以尽可能的就用c()
数据框(data frame)
常见的二维数据表格,==由向量和或因子组成的一个列表,长度一致,数据类型可以不一致==
data.frame
假定每列是一个变量,==且具有相同的长度==,每行是一个观测值。
|
|
注意:
- 使用
dataframe[,1]
,返回当前列的==向量== - 使用
dataframe[1]
,返回当前列的==数据框== - 使用
dataframe[1,]
,返回当前行的==数据框== - 行名和列名不在任意行和列中
- 如果想在数据框中嵌入一个列表需要使用
I()
对数据进行包裹
Tibble
由于现在数据分析中对于数据框的使用和以往的不同,导致现在使用数据框存在很多烦恼,因此诞生了 tibble 这个类型。
对比数据框 tibble 的不同有:
- 与数据框的结构类似,但是相对与数据框拥有更多的返回信息,以及更多的懒加载机制
- 没有行名,所以 tibble 类型提供了行名转换的接口,
tibble(rownames="")
以及rownames_to_colume()
- 取子集时保持行为的一致性,如
tibbl[, var]
和tibble[var]
的结果保持一致,都是 tibble;tibble$var
时取得的都是一个向量 - 不会无端自发扩展,在进行
tibble$x
时,不会自动对 x 进行模糊匹配 - 当构建一个
list-colume
时不再需要I()
进行包裹
总结
{% asset_img “summary02.png” %} {% asset_img “summary01.png” %} {% asset_img “R_Vector.png” %}
对象 | 可包含类型 | 同一对象能否有多种类型 |
---|---|---|
向量 | ALL | F |
因子 | 数值、字符 | F |
数组 | ALL | F |
矩阵 | ALL | F |
数据框 | ALL | T |
列表 | ALL、函数、表达式 | T |
时间序列 | ALL | F |
1.3. 特殊对象
NaN
Not A Number 非数字NA
Not Allow 非法值,缺失数据Inf
无穷大,可加正负
2. 其他常见属性
- 长度:通过
length()
获得 - 类属:通过
class()
获得 - 名:通过
names()
获得 - 维度:通过
dim()
获得
4. 基本运算
+
加-
减*
乘/
除%%
取余%/%
取整除^
幂- 声明和赋值
=
和<-
同样赋值,但是作用不同
参数定义,赋值/传参:=
变量定义,传参:<-
' "
作用一致
单引号内可以有双引号,双引号内可以有单引号
运算符 | 描述 |
---|---|
& | 元素逻辑与运算符,将第一个向量的每个元素与第二个向量的相对应元素进行组合,如果两个元素都为 TRUE,则结果为 TRUE,否则为 FALSE。 |
| | 元素逻辑或运算符,将第一个向量的每个元素与第二个向量的相对应元素进行组合,如果两个元素中有一个为 TRUE,则结果为 TRUE,如果都为 FALSE,则返回 FALSE。 |
! | 逻辑非运算符,返回向量每个元素相反的逻辑值,如果元素为 TRUE 则返回 FALSE,如果元素为 FALSE 则返回 TRUE。 |
&& | 逻辑与运算符,只对两个向量对第一个元素进行判断,如果两个元素都为 TRUE,则结果为 TRUE,否则为 FALSE。 |
|| | 逻辑或运算符,只对两个向量对第一个元素进行判断,如果两个元素中有一个为 TRUE,则结果为 TRUE,如果都为 FALSE,则返回 FALSE。 |
5. 操作符
|
|
6. 发现R包
RDocumentation 搜索引擎,发现和了解 R 包和函数。
参考资料
小洁忘了怎么分身-生信技能树GEO分析课程 R语言数据对象类型-简书 R4beginner-cran R语言编程入门-PLoB Welcome | Advanced R