文章目录
- 矩阵
- 创建矩阵
- matrix()函数
- dim()函数
- 矩阵的函数
- 矩阵的索引
- 矩阵的行和列的命名问题
- 矩阵运算
- 矩阵相乘
- 矩阵与标量相乘
- 矩阵与向量相加
- 矩阵元素筛选
- which函数在矩阵中的应用
- R语言中的%in%运算符
- 对矩阵的行和列调用函数
- apply()函数
- 避免意外降维
矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型))。矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数。反之,向量却不能看作是只有一列或一行的矩阵。
创建矩阵
matrix()函数
格式:
matrix(vector, nrow=1,ncol=1,byrow=FALSE, dimnames=…)
byrow取值为逻辑变量,表示是否将data中的数据按行放至,默认值为FALSE
byrow=T改变的只是数据输入的顺序,矩阵本身依然是按列存储
> x<-matrix(1:12,3,4,byrow = TRUE) > x [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 5 6 7 8 [3,] 9 10 11 12 > as.vector(x) [1] 1 5 9 2 6 10 3 7 11 4 8 12
举例:
> a<-matrix(data=1:4,nrow=2,ncol=2)
> a
[,1] [,2]
[1,] 1 3
[2,] 2 4
举例:
> a<-matrix(1:15,nrow=3)
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 1 4 7 10 13
[2,] 2 5 8 11 14
[3,] 3 6 9 12 15
> a<-matrix(1:15,ncol=5)
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 1 4 7 10 13
[2,] 2 5 8 11 14
[3,] 3 6 9 12 15
举例:
> b<-matrix(nrow=2,ncol=3)
> b[1,1]=1
> b[2,1]=2
> b
[,1] [,2] [,3]
[1,] 1 NA NA
[2,] 2 NA NA
总结:
- 可以只指定行或者列
- 可以生成一个初始空矩阵,然后再进行赋值
- NA表示该数据集中的该数据遗失,不存在。在针对具有NA的数据集进行函数操作的时候,该NA不会被直接剔除。
> mean(b[1,])
[1] NA
> mean(b[,1])
[1] 1.5
dim()函数
可用dim()函数将向量转换成矩阵
格式:
dim(x)<-value
参数x表示要转换成矩阵的向量,value是表示维数的向量
举例:
> x<-1:12
> dim(x)<-c(3,4)#通过dim函数为向量添加维数来构建矩阵
> x
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
矩阵的函数
函数 | 说明 |
dim() | 获取对象(矩阵,数组)的维数,不能获得向量的维数 |
nrow() | 获取矩阵行数 |
crow() | 获取矩阵列数 |
as.vector() | 将矩阵和数组强行转换为向量 |
rbind() | 将向量或者矩阵合并为一个矩阵,按照行合并,即每个子矩阵需要有相同的列数 |
cbind() | 将向量或者矩阵合并为一个矩阵,按照列合并,即每个子矩阵需要有相同的行数 |
head() | |
tail() |
矩阵的索引
矩阵下标可以取正整数、负整数,分别表示矩阵下标对应的内容或者去掉矩阵中相应的行和列
#创建一个3*5的矩阵
> A<-matrix(1:15,3,5)
> A
[,1] [,2] [,3] [,4] [,5]
[1,] 1 4 7 10 13
[2,] 2 5 8 11 14
[3,] 3 6 9 12 15
#取位于第一行第二列的数
> A[1,2]
[1] 4
> A[1,2]<-102
#取位于1、3行,2~4列的数
> A[c(1,3),2:4]
[,1] [,2] [,3]
[1,] 102 7 10
[2,] 6 9 12
#剔除第3行、第2列
> A[-3,-2]
[,1] [,2] [,3] [,4]
[1,] 1 7 10 13
[2,] 2 8 11 14
我们再来看一个例子:
> head(state.x77)
> head(state.x77)[,"Income"]
矩阵的行和列的命名问题
> score<-c(80,90,70,65,87,97,56,78,92)
> score<-matrix(score,3,3)
> score
[,1] [,2] [,3]
[1,] 80 65 56
[2,] 90 87 78
[3,] 70 97 92
> rnames<-c("Linda","James","John")
> cnames<-c("Eng","Math","R")
> dimnames(score)<-list(rnames,cnames)
> score
Eng Math R
LInda 80 65 56
James 90 87 78
John 70 97 92
矩阵运算
函数 | 说明 |
rowSums(x) | 对行求和 |
colSums(x) | 对列求和 |
sum(x) | 矩阵求和 |
#创建一个4*5的矩阵
> x<-matrix(1:20,4,5,byrow=T)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 16 17 18 19 20
#对行求和
> rowSums(x)
[1] 15 40 65 90
#对列求和
> colSums(x)
[1] 34 38 42 46 50
#矩阵求和
> sum(x)
[1] 210
矩阵相乘
> x<-matrix(1:4,nrow=2)
> x
[,1] [,2]
[1,] 1 3
[2,] 2 4
# %*% 等同于行列式的乘法
> x%*%x
[,1] [,2]
[1,] 7 15
[2,] 10 22
矩阵与标量相乘
> x<-matrix(1:4,nrow=2)
> 3*x
[,1] [,2]
[1,] 3 9
[2,] 6 12
矩阵与向量相加
> x <-matrix(1:4,nrow = 2,byrow = TRUE)
> x
[,1] [,2]
[1,] 1 2
[2,] 3 4
> x+10:13
[,1] [,2]
[1,] 11 14
[2,] 14 17
矩阵元素筛选
> x<-matrix(c(1:3,2:4),nrow=3)
> x
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
> x[x[,2]>=3,]
[,1] [,2]
[1,] 2 3
[2,] 3 4
Step 1:
> j<-x[,2]>=3
> j
[1] FALSE TRUE TRUE
Step 2:
x[j,]
说明:
- x[,2]是向量
- >=用于比较两个向量
- 数值3被自动重复,变成一个长度为3的向量
简单来说就是选择第2列大于等于3的行
🎇筛选规则可以基于被筛选变量之外的变量
> z<-c(5,12,13)
> x
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
> x[z%%2==1,]
[,1] [,2]
[1,] 1 2
[2,] 3 4
z%%2==1,返回一个逻辑向量 TRUE FALSE TRUE,x[z%%2==1,]选取对应的行,即第2行、第3行。
🎇筛选规则基于复杂的逻辑运算
> m<-matrix(1:6,nrow=3)
> m
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> m[m[,1]>1 & m[,2]>5,]
[1] 3 6
说明:& 是向量的逻辑“与”,&&是标量的逻辑“与”
m[,1]>1 选取第1列大于1的行,符合要求的有2、3行
m[,2]>5 选取第2列大于5的行,符合要求的只有第3行
又使用了与运算符,选择同时满足两个条件的第3行,最后返回第3行的元素
which函数在矩阵中的应用
> m<-matrix(c(5,2,9,-1,10,11),nrow=3)
> m
[,1] [,2]
[1,] 5 -1
[2,] 2 10
[3,] 9 11
> which(m>2)
[1] 1 3 5 6
which返回的是条件表达式为真的元素所在的位置值
n<-c(1:5)
p<-which(n %in% m)#返回的是n中符合元素的下标
[1] 2 5
n中的第2个和第5个元素在m中
> x <-matrix(1:4,nrow = 2,byrow = TRUE)
> x
[,1] [,2]
[1,] 1 2
[2,] 3 4
> x+10:13
[,1] [,2]
[1,] 11 14
[2,] 14 17
> m<-matrix(c(5,2,9,-1,10,11),nrow=3)
> m
[,1] [,2]
[1,] 5 -1
[2,] 2 10
[3,] 9 11
> which.max(m)#取矩阵m最大值下标
[1] 6
> which.min(m)#取矩阵m最小值下标
[1] 4
R语言中的%in%运算符
判断前面一个向量内的元素是否在后面一个向量中,返回布尔值。
> a <-trunc(runif(10,1,20))
> a
[1] 14 4 10 5 13 11 3 12 2 8
> b <-1:10
> a %in% b
[1] FALSE TRUE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE
提取a在b中出现的元素
> a[a %in% b]
[1] 4 10 5 3 2 8
提取a没有在b中出现的元素
> a[!(a%in%b)]
> [1] 14 13 11 12
> score<-c(80,90,70,65,87,97,56,78,92)
> score<-matrix(score,3,3)
> score
[,1] [,2] [,3]
[1,] 80 65 56
[2,] 90 87 78
[3,] 70 97 92
> rnames<-c("Linda","James","John")
> cnames<-c("Eng","Math","R")
> dimnames(score)<-list(rnames,cnames)
> score
Eng Math R
LInda 80 65 56
James 90 87 78
John 70 97 92
对矩阵的行和列调用函数
*apply()函数系列是R中最受欢迎同时也是最常用的函数族,包括apply(), tapply(), 和lapply()。
apply()功能:
Retruns a vector or array or list of values obtained by applying a function to margins of an array or matrix.
apply()一般形式:
apply(x,dimcode,f,fargs)
说明:
- x是一个矩阵
- dimcode是维度编号,取值为1代表对每一行应用函数,取值为2代表对每一列应用函数,取值为c(1,2)对行和列都进行操作
- f是应用在行或列上的函数
- fargs是f的可选参数集
apply()函数
> m<-matrix(1:6,nrow=3)
> m
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> apply(m,2,mean)
[1] 2 5
> apply(m,2,function(x) mean(x)+2)
[1] 4 7
避免意外降维
> x<-matrix(1:8,nrow=4)
> x
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> r<-x[2,]
> r
[1] 2 6
验证r是向量的方法
方法1:
> is.vector(r)
[1] TRUE
方法2:
> attributes(x)
$dim
[1] 4 2
> attributes(r)
NULL
方法3:
> str(x)
int [1:4, 1:2] 1 2 3 4 5 6 7 8
> str(r)
int [1:2] 2 6
可以加上drop=FALSE,避免降维
> r<-x[2,,drop=FALSE]
> str(r)
int [1, 1:2] 2 6
(x) mean(x)+2)
[1] 4 7
## 避免意外降维
```R
> x<-matrix(1:8,nrow=4)
> x
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> r<-x[2,]
> r
[1] 2 6
验证r是向量的方法
方法1:
> is.vector(r)
[1] TRUE
方法2:
> attributes(x)
$dim
[1] 4 2
> attributes(r)
NULL
方法3:
> str(x)
int [1:4, 1:2] 1 2 3 4 5 6 7 8
> str(r)
int [1:2] 2 6
可以加上drop=FALSE,避免降维
> r<-x[2,,drop=FALSE]
> str(r)
int [1, 1:2] 2 6