R_learning

介于r语言在统计绘图上的强大功能,决定以实用为目的进行粗浅的学习,所使用的教材选择《R语言实战》。代码见RScripts(不要轻易运行以免出现一些奇怪的东西)

Introduce

帮助功能

函数help.start()会打开浏览器窗口,在其中可以查看帮助手册,问题集以及参考材料,其余的参考表格。尝试后发现,若在VScode中使用该命令,会直接在VScode的窗口中打开该html文件。

工作空间

即当前R的工作环境,其储存着所有定义的对象,但会话结束时,可将当前工作空间保存到一个镜像中并在下次载入。管理工作空间的函数如下。

注意到,路径应该使用正斜杠/,反斜杠\会被作为转义符,此外setwd()函数只能切换目录而不能常见新的目录

第一次安装某一个包:install.packages("*")

更新某一个包:update.packages("*")

查看已安装包的描述:installed.packages("*")

包的载入:library(*)


tips:处理大型数据集时需要专门的手段

Creat Dataset

R可以处理的数据类型包括数值,字符,逻辑型,复数,字节。

以下图的数据集为例

PatientID是行/实例型变量,AdmDate为日期型变量,Age是连续型(定量型)变量,Daibetes是名义变量,Status是顺序变量。名义变量和顺序变量都是分类变量,但顺序变量具有自然的顺序性。

R会将实例标识符称为rowname,分类变量称为因子

数据结构

向量

c()创建向量,如:

1
2
3
a <- c(1, 2, 5, 3, 6, -2, 4) # 数值型
b <- c("one", "two", "three") # 字符型
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE) # 逻辑型

注意,单个向量中的数据类型必须相同。

此外,只含一个元素的向量称为标量,如f <- 3,常用于保存常量

通过方括号访问向量中的元素,==R中的位置索引从1开始而非从零开始==,可以同时访问多个元素。

1
2
3
4
a <- c("k", "j", "h", "a", "c", "m")
a[3] # "h"
a[c(1, 3, 5)] # "k" "h" "c"
a[2:6] # "j" "h" "a" "c" "m"

矩阵

矩阵为一个二维数组,同样的,其中的每一个元素必须是相同的类型。通过matrix()创建矩阵,通常所用的格式为:

1
2
3
mymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns,
byrow=logical_value,dimnames=list(
char_vector_rownames,char_vector_colnames))

其中vector包含矩阵的元素,其后两个参数分别代表了矩阵的的形状,参数byrow表明矩阵的填充方式(默认按列),为一个布尔值。dimnames为可选参数,其中的char_vector_rownameschar_vector_colnames为字符型向量,表明行名和列名。以下为两个示例:

1
2
3
4
5
6
7
y <- matrix(1:20, nrow=5, ncol=4)
# [,1] [,2] [,3] [,4]
#[1,] 1 6 11 16
#[2,] 2 7 12 17
#[3,] 3 8 13 18
#[4,] 4 9 14 19
#[5,] 5 10 15 20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cells <- c(1, 26, 24, 68)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cells,
nrow = 2, ncol = 2, byrow = TRUE,
dimnames = list(rnames, cnames))
# C1 C2
#R1 1 26
#R2 24 68

mymatrix <- matrix(cells,
nrow = 2, ncol = 2, byrow = FALSE,
dimnames = list(rnames, cnames))
# C1 C2
#R1 1 24
#R2 26 68

tips:也可以只填写nrowncol中的一个,但参数的位置不能交换。


通过下标和反括号选择矩阵中的行X[i,],列X[,j]或元素X[i,j],通过将i或j定义为数值型向量可以选择多行或者多列。若i和j均为向量,那么所选择的是一个对应的行和列交叉点处的元素组成的新矩阵。

tips:矩阵中无法通过行名和列名访问元素。

数组

作为矩阵的推广,数组可以是多维的,通过array()创建,如:

1
myarray <- array(vector, dimensions, dimnames)

其中dimensions为数值型向量,给出各维度下标的最大值,dimnames为可选变量,为一个包含各维度名称标签的列表,每个维度的名称标签为一个字符型向量。和矩阵一样,数组内的元素只能是一种类型。以下为一个三维(2×3×4)数值型数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z <- array(1:24, c(2, 3, 4), dimnames = list(dim1, dim2, dim3))
#, , C1
#
# B1 B2 B3
#A1 1 3 5
#A2 2 4 6
#
#, , C2
#
# B1 B2 B3
#A1 7 9 11
#A2 8 10 12
#
#, , C3
#
# B1 B2 B3
#A1 13 15 17
#A2 14 16 18
#
#, , C4
#
# B1 B2 B3
#A1 19 21 23
#A2 20 22 24

可以看到,数组的输出为多个矩阵,对于n维数组,将数组从后n-2个维度展开,每一项为一个矩阵进行输出,在每一个矩阵前, , *, *, ...即为对应的后n-2个维度中每一个维度内的编号。

数组中,填充顺序与参数dimensions中的顺序一致,即[1, 1, 1, ...] -> [2, 1, 1, ...] -> ... -> [dimensions[1], 1, 1, ...] -> [1, 2, 1, ...] -> [2, 2, 1, ...] -> ...。即先外层,再内层

数据框

矩阵另一种方式的推广,其不同的列可以包含不同模式的数据,在表2-1中显示的数据集即一个数据框。数据框可以通过data.frame()创建,如:

1
mydata <- data.frame(col1, col2, col3, ...)

其中col1col2col3可以为任意类型的向量。

当没有指定列名时,R会自动将变量名作为列名:

1
2
3
4
5
6
7
8
9
10
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
# patientID age diabetes status
#1 1 25 Type1 Poor
#2 2 34 Type2 Improved
#3 3 28 Type1 Excellent
#4 4 52 Type1 Poor

可以用names函数指定列名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
col1 <- c(1, 2, 3, 4)
col2 <- c(25, 34, 28, 52)
col3 <- c("Type1", "Type2", "Type1", "Type1")
col4 <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(col1, col2, col3, col4)
print(patientdata)
# col1 col2 col3 col4
#1 1 25 Type1 Poor
#2 2 34 Type2 Improved
#3 3 28 Type1 Excellent
#4 4 52 Type1 Poor

names(patientdata) <- c("patientID", "age", "diabetes", "status")
print(patientdata)
# patientID age diabetes status
#1 1 25 Type1 Poor
#2 2 34 Type2 Improved
#3 3 28 Type1 Excellent
#4 4 52 Type1 Poor

数据框数据的选中有多种方式,可用类似矩阵的下标记号,也可以指定列名:

1
2
3
4
5
6
7
8
9
10
11
12
print(patientdata[1:2])
# patientID age
#1 1 25
#2 2 34
#3 3 28
#4 4 52
print(patientdata[c("diabetes", "status")])
# diabetes status
#1 Type1 Poor
#2 Type2 Improved
#3 Type1 Excellent
#4 Type1 Poor

当用坐标的形式选中时,其表现形式与矩阵的选中一致。注意patientdata[1]patientdata[,1]不同。

而数据框的选中还有一种特殊的形式,即符号$,用于选取一个给定数据框中的某个特定变量。

例如生成diabetesstatus的列联表:

1
2
3
4
print(table(patientdata$diabetes, patientdata$status)
# Excellent Improved Poor
#Type1 1 0 2
#Type2 0 1 0