R语言—矩阵

矩阵

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型))。矩阵(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)

image-20220901085753902

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

image-20220901090123404

矩阵的行和列的命名问题

> 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

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_chuanqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值