R语言(3):矩阵和数组、安装和使用包

3.1 创建矩阵

y<- matrix(c(1,2,3,4),nrow=2,ncol=2) #R中是按照列进行存储,这就决定了元素的顺序
y <- matrix(c(1,2,3,4),nrow=2) #只需要一个参数就可以
m <- matrix(c(1,2,3,4,5,6),nrow=2,byrow=T) #按照行进行存储
n <- matrix(nrow = 2, ncol = 2) #生成空矩阵

 运行结果:

> y
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> y
     [,1] [,2]
[1,]    1    3
[2,]    2    4
 
> m
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

> n
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA

3.2 一般矩阵运算

3.2.1 矩阵的运算

相乘:%*%

数量乘法:3*y

加法:+

3.2.2 矩阵索引

z <- matrix(1:12,4,3)
z
z[,2:3] #提取第2到3列
z
y <- matrix(1:6,3,2)
y
y[2:3,] #提取2:3行
y
y[2:3,2] #提取2:3行的第2列
y
y(c(1:3),) <- matrix(c(1,1,8,12),nrow = 2) #给子矩阵进行赋值,即y的第1、3行!!!!!!
y

3.2.3 拓展案例:图像操作

1、安装和使用包

自动安装包:

在R语言的窗口中,输入以下命令

install.packages("mvtnorm","a/b/c") #其中a/b/c是安装地址

这会让R自动连接到CRAN下载并编译包,然后加载到相应目录里 

列出包中所有的函数:

以下两个任意一个都可以

library(help=mvtnorm)
help(package =mvtnorm)

将包加载到内存中使用

library()

 2、具体使用

3.2.4 矩阵元素的筛选

x <- matrix(c(1,2,3,2,3,4),3,2)
j <- x[,2] >=3  #判断x的第二列向量有哪些元素大于等于3并且返回布尔值
m = x[j,] #然后在x中使用,x[j,]的行与向量j中的TRUE相对应
m #输出结果
n = x[x[,2] >=3,]
n

结果:

3.2.5 拓展案例:生成协方差矩阵

如果我们想要用MASS库中的mvrnorm()函数生成多元多态分布的随机数,需要指定协方差矩阵

代码:

makecov <- function(rho, n){
  m <- matrix(nrow = n,ncol = n)
  m <- ifelse(row(m)== col(m),1,rho)
  return(m)
}
makecov(0.7,2)

3.3 对矩阵的行和列调用函数!!!(重要)

apply() 函数允许用户在矩阵的各行或各列上调用指定函数

3.3.1 apply(m,dimcode,f,fargs)

m:是矩阵

dimcode :1表示对行操作,2表示对列操作

f:应用在行或列上的函数

fargs:是f的可选参数集

解释:

z <- matrix(1:4,2,2)
apply(z,2,mean) #对z的每一列求均值输出向量
f <- function(x) x/c(2,8) #f()把一个向量除以(2,8)【如果x的长度大于2,那么(2,8)会循环补齐】
y <- apply(x,1,f)

3.3.2 案例1:返回一个(0,1)矩阵中每行前D个元素中较多的那个(一样多就返回0)

copymaj <- function(rw, d){
  maj <- sum(rw[1:d] /d)
  return (if (maj >0/5)1 else 0)
}
setwd("D:/Rfiles/project1")  #这个是将R语言的指针弄到函数文件的前一个文件包中,在这里是指到桌面
source("copymaj.R",encoding="utf-8") 
x <- round(matrix(runif(25),5,5))
apply(x,1,copymaj,2)

3.3.3案例2: 寻找异常值(检测一组数据中与中位数差别最大的观测值)

其中矩阵中的每一行数据为一组数据

#写函数 求出相差最大的序号

findol <- function(xrow) {
  mdn <- median(xrow)
  devs <- abs(xrow - mdn)
  return (which.max(devs))
}
x<- matrix(1:6,nrow = 3)
x
apply(x,1,findol)#返回每一行的最大值的索引位置

结果:

  

3.4 增加或删除矩阵的行和列

3.4.1 改变矩阵的大小

通过直接赋值的方法:

m <- matrix(1:6,nrow=3)
m
m<- m[c(1,3),]
m

结果:

 

运用rbind()【按行组合】和cbind()【按列组合】:

rbind()--row bind,cbind()--column bind,当m的数少时会循环补齐,当多时会报错

m <- c(1,2)
z <- matrix(1:6,nrow = 3)
l <- rbind(m,z)

注意:运用cbind和rbind都是开发了新空间会造成资源的浪费,在一般的实验中常常先创建好一个空的大矩阵然后进行赋值

3.4.2 拓展案例:找到图中距离最近的一对端点

imin <- function(x){ #x是矩阵的某一行
  lx <- length(x)
  i <- x[lx] #对后一个元素,就是行号
  j <- which.min(x[(i+1):(lx-1)]) #返回一个行号 #上三角的元素,对角线都是0不用管
  k <- i+j #j不是整体的列号,加上行号就会得到证实的列好
  return (c(k,x[k])) #K是列好,x[k]是值
}
source("imin.R",encoding="utf-8") 
mind <- function(d){
  n <- nrow(d) #获取矩阵的行数
  dd <- cbind(d,1:n) #在d的右边加上1:n索引
  wmins <- apply(dd[-n,],1,imin) #删除最后一行的元素,每一行都得到K和X[K],最后生成2*4的矩阵
  i <- which.min(wmins[2,]) 
  j <- wmins[1,i]
  return (c(d[i,j],i,j))
  
  }
#运行:
setwd("D:/Rfiles/project1")  #这个是将R语言的指针弄到函数文件的前一个文件包中,在这里是指到桌面
source("mind.R",encoding="utf-8")

x <- round(matrix(runif(100,0,100),10,10))
x <- x+t(x)
x <- ifelse(row(x) == col(x),0,x)
mind(x)

3.5 矩阵的函数

length获得矩阵中的数字个数

attributes(l)返回矩阵的组件

dim返回矩阵的行和列

nrow和ncol返回行数和列数

3.6 避免意外降维

当提取矩阵的某一行是,会变成向量而不是矩阵 因此导致了意外降维

避免意外降维的方法:

1、drop参数

r <- z[2,,drop = F]#注意两个逗号

2、as.matrix()进行强制转换

3.7 矩阵的行和列的命名问题

向量是给每一个元素命名,矩阵是给某一行或者某一列命名

z <- matrix(1:4,2)
colnames(z)
colnames(z) <-c("a","b")
z[,"a"]
#结果:[1] 1 2

3.8 高维数组

了解一下;

生成3*3*2的矩阵

firsttest<- matrix(c(46,21,50,30,25,50),nrow = 3)
secondtest <- matrix(c(46,41,50,43,35,50),nrow = 3)
tests <- array(data = c(firsttest,secondtest),dim = c(3,3,2))
tests  

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值