R语言中的数据结构----矩阵
目录
(1)创建矩阵
(2) 线性代数运算
(3)矩阵索引
(4)矩阵元素的筛选
(5)增加或删除矩阵的行或列
(6)apply()函数
(7)矩阵和向量的区别
(8)避免意外降维
(9)矩阵行和列的命名
(10)高维数组
矩阵的基本操作
#将c(1,4)和c(1,2)两个向量绑定起来
> m<-rbind(c(1,4),c(2,2))
> m[,1] [,2]
[1,] 1 4
[2,] 2 2
#计算向量(1,1)和m的矩阵积
> m%*%c(1,1)[,1]
[1,] 5
[2,] 4
#第一行第二列
> m[1,2]
[1] 4
#第二行第二列
> m[2,2]
[1] 2
#第一行
> m[1,]
[1] 1 4
#第二列
> m[,2]
[1] 4 2
>
(1)创建矩阵
法一
> y<-matrix(c(1,2,3,4),nrow=2,ncol=2)
> y[,1] [,2]
[1,] 1 3
[2,] 2 4
#可以只定义nrow和ncol中的一个
> y<-matrix(c(1,2,3,4),nrow=2)
> y[,1] [,2]
[1,] 1 3
[2,] 2 4
#表示创建矩阵第二列
> y[,2]
[1] 3 4
法二
#byrow参数设置为TRUE,使矩阵元素按行排列
> m<-matrix(c(1,2,3,4,5,6),nrow=2,byrow=T)
> m[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6y<-matrix(nrow=2,ncol = 2)
> y[1,1]<-1
> y[2,1]<-2
> y[1,2]<-3
> y[2,2]<-4
> y[,1] [,2]
[1,] 1 3
[2,] 2 4
(2) 线性代数运算
#矩阵相乘
> y%*%y[,1] [,2]
[1,] 7 15
[2,] 10 22
#矩阵数量乘法
> 3*y[,1] [,2]
[1,] 3 9
[2,] 6 12
#矩阵加法
> y+y[,1] [,2]
[1,] 2 6
[2,] 4 8
(3)矩阵索引
•使用逗号,分隔行和列索引来访问矩阵中的元素
# 创建一个3x3的矩阵
mat <- matrix(1:9, nrow = 3)
mat# 访问特定元素
mat[2, 3] # 访问第2行第3列的元素,输出为6#也可以使用
> "["(z,3,2)
[1] 7
#"["相当于一个函数# 访问整行或整列
mat[1, ] # 访问第1行的所有元素,输出为 1 4 7
mat[, 2] # 访问第2列的所有元素,输出为 2 5 8# 访问多行或多列
mat[2:3, ] # 访问第2行和第3行的所有元素
mat[, c(1, 3)] # 访问第1列和第3列的所有元素
•使用逻辑向量来选择满足特定条件的行或列
# 创建一个3x3的矩阵
mat <- matrix(1:9, nrow = 3)
mat# 使用逻辑向量进行索引
mat[mat > 5] # 选择大于5的元素,输出为 6 7 8 9
mat[mat[, 2] > 3, ] # 选择第2列大于3的行的所有元素
•对一个矩阵的子矩阵进行赋值
> y<-matrix(c(1:6),nrow=3)
> y[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
#第一行和第三行赋值
> y[c(1,3),]<-matrix(c(1,1,8,12),nrow=2)
> y[,1] [,2]
[1,] 1 8
[2,] 2 5
[3,] 1 12> x<-matrix(nrow=3,ncol=3)
> y<-matrix(c(4,5,2,3),nrow=2)
> y[,1] [,2]
[1,] 4 2
[2,] 5 3
> x[2:3,2:3]<-y
> x[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 4 2
[3,] NA 5 3
(4)矩阵元素的筛选
> x<-matrix(c(1,2,3,2,3,4),nrow=3)
> x[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
#判断第二列元素是否>=3,若>=3,则输出
> x[x[,2]>=3,][,1] [,2]
[1,] 2 3
[2,] 3 4
逐步分解为
> j<-x[,2]>=3
> j
[1] FALSE TRUE TRUE
#x[j,]的行与向量j中的取值为TRUE的行对应
> x[j,][,1] [,2]
[1,] 2 3
[2,] 3 4> x<-matrix(c(1:6),nrow=3)
> x[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> z<-c(5,12,13)
#z%%2==1用于判断z的每个元素是否是奇数,返回的结果是(TRUE,FALSE,TRUE)
#因此我们提取第1,3行的数据
> x[z%%2==1,][,1] [,2]
[1,] 1 4
[2,] 3 6
注意:如果写为以下形式,就不是以矩阵形式显示了
>x[z%%2==1]
[1] 1 3 4 6> x[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
#这里用了&,表示两个条件都需要判断
> x[x[,1]>1 & x[,2]>5,]
[1] 3 6#which(m>2)来查找矩阵m中大于2的元素的索引
> 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
#m的1,3,5,6个元素大于2
(5)增加或删除矩阵的行或列
> x<-c(12,5,13,16,8)
> x
[1] 12 5 13 16 8
> x<-c(x,20)
> x
[1] 12 5 13 16 8 20
> x<-c(x[1:3],20,x[4:6])
> x
[1] 12 5 13 20 16 8 20
> x<-x[-2:-4]
> x
[1] 12 16 8 20
> one<-c(1,1,1,1)
> z<-matrix(c(1,2,3,4,1,1,0,0,1,0,1,0),nrow=4)
> z[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 1 0
[3,] 3 0 1
[4,] 4 0 0
> cbind(one,z)one
[1,] 1 1 1 1
[2,] 1 2 1 0
[3,] 1 3 0 1
[4,] 1 4 0 0#1被循环补齐为由4个1组成的列向量
> cbind(1,z)[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 1 2 1 0
[3,] 1 3 0 1
[4,] 1 4 0 0#和创建向量一样,创建一个新的矩阵很消耗时间
> q<-cbind(c(1,2),c(3,4))
> q[,1] [,2]
[1,] 1 3
[2,] 2 4#可以通过重新赋值来删除矩阵的行或列
> m<-matrix(1:6,nrow=3)
> m[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6> m<-m[c(1,3),]
> m[,1] [,2]
[1,] 1 4
[2,] 3 6
(6)apply()函数
apply()函数的格式
apply(m,dimcode,f,farge)
m代表一个矩阵
dimcode表示维度代码,1表示每一行应用函数,2表示每一列应用函数
f是应用在行,列上的函数
farge是f的可选参数集
> z<-matrix(c(1:6),nrow = 3)
> z[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> apply(z,2,mean)
#或者可以直接使用colMeans
> colMeans(z)
[1] 2 5这里的f可以是自定义函数
> f<-function(x){
+ return(x/c(2,8))
+ }
> y<-apply(z,1,f)
> y[,1] [,2] [,3]
[1,] 0.5 1.000 1.50
[2,] 0.5 0.625 0.75fargs表示可选参数集
> copymag<-function(rw,d){
#向量每个元素对应矩阵的每行,如果该行前d个元素中1较多,向量对应元素就取1,反之取0
+ maj<-sum(rw[1:d])/d
+ return(if(maj>0.5)1 else 0)
+ }
> x<-matrix(c(1,1,1,0,0,1,0,1,1,1,0,1,1,1,1,1,0,0,1,0),nrow = 4)
> x[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 1 1 0
[2,] 1 1 1 1 0
[3,] 1 0 0 1 1
[4,] 0 1 1 1 0
> apply(x,1,copymag,3)
[1] 1 1 0 1> apply(x,1,copymag,2)
[1] 0 1 0 0
#这里的3,2是函数copymaj()中形式参数d的实际取值,矩阵的第一行是(1,0,1,1,0),当d取3时,前3个是(1,0,1),1占多数,则copymag返回1,第一个元素为1,其他以此类推> apply(x,2,copymag,2)
[1] 1 0 1 1 0
(7)矩阵和向量的区别
> z<-matrix(c(1:8),nrow = 4)
> z[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
#z作为1个向量,可以求他的长度
> length(z)
[1] 8#z也是一个矩阵,有矩阵的性质
> dim(z)
[1] 4 2
> nrow(z)
[1] 4
> ncol(z)
[1] 2#得到矩阵的行数和列数,[1]显示行数,[2]显示列数
> nrow<-function(x)
+ dim(x)[1]
> nrow(z)
[1] 4
>
(8)避免意外降维
> z[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> r<-z[2,]
> r
[1] 2 6
#这里的r是一个长度为2的向量,而不是一个1*2的矩阵,所以出现了降维,如何避免降维呢可以用以下方法验证
> attributes(z)
$dim
[1] 4 2> attributes(r)
NULL
> str(z)int [1:4, 1:2] 1 2 3 4 5 6 7 8
> str(r)int [1:2] 2 6可以用drop()参数
> r<-z[2,,drop=FALSE]
#r是一个1*2的矩阵
> r[,1] [,2]
[1,] 2 6
> dim(r)
[1] 1 2
(9)矩阵行和列的命名
> z<-matrix(c(1:4),nrow = 2)
> z[,1] [,2]
[1,] 1 3
[2,] 2 4
> colnames(z)
NULL
> colnames(z)<-c("a","b")
> za b
[1,] 1 3
[2,] 2 4
> colnames(z)
[1] "a" "b"
> z[,"a"]
[1] 1 2
(10)高维数组
> firsttest<-matrix(c(46,21,50,30,25,48),nrow=3)
> secondtest<-matrix(c(46,41,50,43,35,49),nrow=3)> test<-array(data=c(firsttest,secondtest),dim=c(3,2,2))#共有2层,每层分别是3行2列
> attributes(test)
$dim
[1] 3 2 2#学生3第一次考试,第二部分的得分
> test[3,2,1]
[1] 48
#逐层显示
> print(test)
, , 1[,1] [,2]
[1,] 46 30
[2,] 21 25
[3,] 50 50, , 2[,1] [,2]
[1,] 46 43
[2,] 41 35
[3,] 50 50