R语言统计分析与应用-第二章-1
写在前面的话,R语言统计分析与应用这本书的第一章是讲的怎么下载与安装R,这里就不再赘述了。下面开始第二章。 这本书我决定不再像之前那本书一样,照着书上写,这本书会加入自己的吐槽,只不过在代码上保持一致。 # 第二章 R编程入门 在学习R的时候,总会发现,自己编写一些函数还是比较爽的。在介绍编程之前,首先回顾下R的基础知识。 ## 2.1.1 数据集的概念 这个数据集,对于R语言而言非常重要,在我日常处理的时候,往往因为数据集的问题而导致R报错。看来基础知识还是要掌握地扎实才可以。 1. 向量 这个是R组基础的东西了,是一系列元素的组合,可以存储数值型、字符型或者逻辑型的数据。
#创建一个向量
#数值型
a <- c(1,2,3,4,10,-9,20)
#字符型
b <- c("one", "two", "three")
#逻辑型
c <- c(TRUE, FALSE, TRUE, TRUE, FALSE, FALSE)
#字符型
d <- c("a", "a", "b", "b", "c")
有的时候想查询某个向量中的某个元素,可以这样做:
d <- c(1,3,5,9,7,10,23,21,17)
#查询第二个元素
d[2]
## [1] 3
#查询第二到第五个元素
d[2:5]
## [1] 3 5 9 7
#查询某几个元素
d[c(1,2,6,7)]
## [1] 1 3 10 23
- 矩阵 矩阵就是线性代数里的概念,是个二维数组,每个元素是相同的类型(同为数值、同为字符或者同为逻辑),可通过函数matrix创建。
#创建一个4行,5列的矩阵,数值排列为按列
x <- matrix(21:40, nrow = 4, ncol = 5, byrow = FALSE)
x
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 29 33 37
## [2,] 22 26 30 34 38
## [3,] 23 27 31 35 39
## [4,] 24 28 32 36 40
#创建一个含有列名标签的矩阵,并按行排列数值
fourcell <- c(1,2,3,10,20,30)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2", "C3")
mymatrix <- matrix(fourcell, nrow = 2, ncol = 3, byrow = TRUE,
dimnames = list(rnames, cnames))
mymatrix
## C1 C2 C3
## R1 1 2 3
## R2 10 20 30
#创建一个含有列名标签的矩阵,并按列排列数值
mymatrix1 <- matrix(fourcell, nrow = 2, ncol = 3, byrow = FALSE,
dimnames = list(rnames, cnames))
mymatrix1
## C1 C2 C3
## R1 1 3 20
## R2 2 10 30
类似于向量,矩阵也可以用类似的方式查询某行某列的元素。 不过要从向量的一维推广到矩阵的二维。
aa <- matrix(1:20, nrow = 5)
aa
## [,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
#查询第三行
aa[3,]
## [1] 3 8 13 18
#查询第三列
aa[,3]
## [1] 11 12 13 14 15
#查询第三行的第三、第四列元素
aa[3,c(3,4)]
## [1] 13 18
#查询第三行第三列元素
aa[3,3]
## [1] 13
#查询第三、第四列元素
aa[,c(3,4)]
## [,1] [,2]
## [1,] 11 16
## [2,] 12 17
## [3,] 13 18
## [4,] 14 19
## [5,] 15 20
- 数组 矩阵只能是二维的,这是必须的~,而要创建2维以上的,则要用到数组了创建函数是array(vector, dimensions, dimnames),其中的参数vector是数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames则是各维度名称的列表。
dim1 <- c("X1", "X2")
dim2 <- c("Y1", "Y2", "Y3")
dim3 <- c("Z1", "Z2", "Z3", "Z4")
#这个数组中c(4,3,2)代表着,与dimnames对应,dim3最多有4个数值,dim2最多有3个数值,dim1最多有2个数值
xyz <- array(1:24, c(4,3,2), dimnames = list(dim3, dim2, dim1))
xyz
## , , X1
##
## Y1 Y2 Y3
## Z1 1 5 9
## Z2 2 6 10
## Z3 3 7 11
## Z4 4 8 12
##
## , , X2
##
## Y1 Y2 Y3
## Z1 13 17 21
## Z2 14 18 22
## Z3 15 19 23
## Z4 16 20 24
数组的查询方式与矩阵类似。为方便理解,将X定义为“长”,Y定义为“宽”,Z则定义为“高”.
#查询高下标为1,宽下标为2的元素
xyz[1,2,]
## X1 X2
## 5 17
#查询高下标为1,宽下标为3的元素
xyz[1,3,]
## X1 X2
## 9 21
#查询宽下标为2,长下标为2的元素
xyz[,2,2]
## Z1 Z2 Z3 Z4
## 17 18 19 20
#查询高下标为3,宽下标为2,长下标为1的元素
xyz[3,2,1]
## [1] 7
- 数据框 这个数据框与SPSS中看到的数据集类似。不同的列可以包含不同类型的元素(数值型、字符型等)。这也是R中最常见的数据结构。有些时候,矩阵不够用的情况下,这个数据框就会起很大作用。
IDnumber <- c(101,102,103,104)
age <- c(24,78,56,45)
hypertention <- c("yes", "no", "no", "yes")
severity <- c("high", "middle", "low", "middle")
patientdata <- data.frame(IDnumber, age, hypertention, severity)
patientdata
## IDnumber age hypertention severity
## 1 101 24 yes high
## 2 102 78 no middle
## 3 103 56 no low
## 4 104 45 yes middle
在数据框中选取元素可以用很多种方式,既可以用矩阵、数组的下标方法,也可以直接指定列名。
#查询第一列也就是IDnumber
patientdata[1]
## IDnumber
## 1 101
## 2 102
## 3 103
## 4 104
#查询第一列以及第二列,也就是IDnumber和age
patientdata[1:2]
## IDnumber age
## 1 101 24
## 2 102 78
## 3 103 56
## 4 104 45
#查询age这一列
patientdata["age"]
## age
## 1 24
## 2 78
## 3 56
## 4 45
#查询age和severity
patientdata["age", "sverity"]
## NULL
#查询age中的元素
patientdata$age
## [1] 24 78 56 45
这个“$”符号是比较常用的使用方法,它被用来选取一个给定数据框的某个特定变量。也可以联合使用attach()和detach()函数,或者单独使用with()函数来简化代码……
书上是这么说的,但我觉得,“$”这个符号在日后阅读代码时比较好理解。
attach()函数可以将数据框添加到R的搜索路径中。而detach()函数将数据框从搜索路径中移除。下面的代码获取年龄(age)变量的描述性统计,并分别绘制age变量与收缩压(hypertention)的散点图。
systolic <- c(120,130,140,150,160)
age <- c(20,30,40,50,55)
hypertention <- data.frame(systolic, age)
hypertention
## systolic age
## 1 120 20
## 2 130 30
## 3 140 40
## 4 150 50
## 5 160 55
summary(hypertention$age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 20 30 40 39 50 55
summary(hypertention$systolic)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 120 130 140 140 150 160
plot(hypertention$age, hypertention$systolic)
#上面代码也可以简化为
attach(hypertention)
## The following objects are masked _by_ .GlobalEnv:
##
## age, systolic
summary(age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 20 30 40 39 50 55
summary(systolic)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 120 130 140 140 150 160
plot(systolic, age)
detach(hypertention)
#或者
with(hypertention,{
summary(age)
summary(systolic)
plot(systolic, age)
})
但是with()函数有一个特殊情况需要注意,如果出现with()里要对某个不在原数据框中的变量赋值,那这个变量若不注意赋值格式,则会出现下面的问题。
with(hypertention, {
stat <- summary(age)
stat
})
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 20 30 40 39 50 55
#这个时候如果输入stat,则会出现“找不到对象‘stat’”
这个问题就出在赋值符号<-上,如果要创建在with()结构以外存在的对象,则要用“<<-”符号代替“<-”。这样,这个对象就可以保存在with()之外的全局环境中。
with(hypertention, {
stat <<- summary(age)
})
#这个时候stat就成为全局变量了
stat
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 20 30 40 39 50 55