文章目录

  • 矩阵
  • 创建矩阵
  • 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)

R语言 群落物种矩阵 r语言矩阵图_开发语言

> head(state.x77)[,"Income"]

R语言 群落物种矩阵 r语言矩阵图_r语言_02

矩阵的行和列的命名问题

> 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