矩陣是一種特殊的向量,包括兩個(gè)附加的屬性:行數(shù)和列數(shù)牲距。所以矩陣和向量一樣,有數(shù)據(jù)類(lèi)型的概念钥庇。
數(shù)組是高維的對(duì)象牍鞠,矩陣是數(shù)組的特殊情形。 ###3.1創(chuàng)建矩陣 按列存儲(chǔ)评姨,先第一列再第二列难述,以此類(lèi)推。 matrix()函數(shù)
y <- matrix(c(1,2,3,4),nrow = 2,ncol = 2)
y
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
在矩陣中的四個(gè)元素都指定了的情況下,nrow和ncol二選一即可
y <- matrix(c(1,2,3,4),nrow = 2)
也可先列框架再挨個(gè)賦值
y=matrix(nrow = 2,ncol = 2)
y
## [,1] [,2]
## [1,] NA NA
## [2,] NA NA
y[1,1] <- 1
y[2,1] <- 2
y[1,2] <- 3
y[2,2] <- 3
參數(shù):byrow=T胁后,元素按行排列 ### 3.一般矩陣運(yùn)算
3.1.線性代數(shù)運(yùn)算
y %*% y
## [,1] [,2]
## [1,] 7 12
## [2,] 8 15
3*y
## [,1] [,2]
## [1,] 3 9
## [2,] 6 9
y+y
## [,1] [,2]
## [1,] 2 6
## [2,] 4 6
3.2 矩陣索引
提取子矩陣 例如:z[2:3,],y[c(1,3),] 可以給子矩陣賦值
y[c(1,2),] <- matrix(c(1,1,8,12),nrow = 2)
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
負(fù)值表示反選硫眯、排除
y[-2,]表示去掉第二行
3.3 矩陣元素篩選
x <- matrix(c(1:3,2:4),nrow = 3)
x
## [,1] [,2]
## [1,] 1 2
## [2,] 2 3
## [3,] 3 4
j <- x[,2]>=3
j
## [1] FALSE TRUE TRUE
x[j,]
## [,1] [,2]
## [1,] 2 3
## [2,] 3 4
z <- c(5,12,13)
x[z%%2==1,]
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
x[x[,1]>1 & x[,2]>3,]
## [1] 3 4
which(x>2)
## [1] 3 5 6
假設(shè)n個(gè)隨機(jī)變量的方差都為1,每?jī)蓚€(gè)變量之間的相關(guān)性都是rho,則生成協(xié)方差矩陣的函數(shù)
makecov <- function(rho,n) {
m <- matrix(nrow=n,ncol=n)
m <- ifelse(row(m) == col(m),1,rho)
return(m)
}
3.3 對(duì)矩陣的行和列的調(diào)用函數(shù)
apply()參數(shù):
apply(X, MARGIN, FUN, ...)
X表示操作的數(shù)組/矩陣名稱(chēng) MARGIN表示維度編號(hào)择同,1表示行两入,2表示列 FUN表示函數(shù),如果函數(shù)有多個(gè)參數(shù)敲才,以逗號(hào)分隔加在后面裹纳。
z <- matrix(c(1:3,4:6),nrow = 3)
z
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
apply(z, 2, mean)
## [1] 2 5
f <- function(x)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.75
由此可見(jiàn),apply產(chǎn)生矩陣形式的結(jié)果時(shí)紧武,是默認(rèn)按列輸出剃氧。
3.3.2 尋找異常值
findols <- function(x) {
findol <- function(xrow) {
mdn <- median(xrow)
devs <- abs(xrow-mdn)
return(which.max(devs))
}
return(apply(x,1,findol))
}
尋找每行的離群點(diǎn)(與中位數(shù)差值的絕對(duì)值最大的數(shù))所在位置
3.4 增加或刪除矩陣的行或列
3.4.1 改變矩陣的大小
cbind和rbind可以按行或列拼接矩陣
z
## [,1] [,2]
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
cbind(z,1)
## [,1] [,2] [,3]
## [1,] 1 4 1
## [2,] 2 5 1
## [3,] 3 6 1
重新賦值以刪除行
z <- z[c(1,3),]
z
## [,1] [,2]
## [1,] 1 4
## [2,] 3 6
3.4.2 擴(kuò)展案例:找到圖中距離最近的一對(duì)的端點(diǎn)
方法一:
mind <- function(d) {
n <- nrow(d)
dd <- cbind(d,1:n)
wmins <- apply(dd[-n,],1,imin)
i <- which.min(wmins[2,])
j <- wmins[1,i]
return(c(d[i,j],i,j))
}
imin <- function(x) {
lx <- length(x)
i <- x[lx] # original row number
j <- which.min(x[(i+1):(lx-1)])
k <- i+j
return(c(k,x[k]))
}
imin函數(shù)返回了最小值和下標(biāo),wmins則是apply計(jì)算出的每行最小值及其下標(biāo)矩陣阻星,i和j是最小值的行列號(hào)朋鞍。
方法二:
minda <- function(d) {
smallest <- min(d)
ij <- which(d == smallest,arr.ind=TRUE)
return(c(smallest,ij))
}
方法二不適用于有多個(gè)最小值的情況,但會(huì)簡(jiǎn)潔一些妥箕。
3.5 向量和矩陣的差異
矩陣比向量多兩個(gè)屬性:行數(shù)和列數(shù)
z <- matrix(1:8,nrow = 4)
z
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
length(z)
## [1] 8
class(z)
## [1] "matrix"
attributes(z)
## $dim
## [1] 4 2
attributes(z)$dim
## [1] 4 2
nrow 和ncol是對(duì)dim的簡(jiǎn)單封裝
nrow <- function(x) dim(x)[1]
3.6 避免意外降維
按行/列取子集使矩陣變向量,也就是自動(dòng)降維滥酥,避免降維的參數(shù)是drop
z
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
r=z[2,]
dim(r)
## NULL
r <- z[2,,drop=FALSE]
dim(r)
## [1] 1 2
3.7 矩陣的行和列命名
給colnames/rownames賦值
z
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
colnames(z) <- c("a","b")
rownames(z) <- LETTERS[1:4]
3.8 高維數(shù)組
三維是再行列的基礎(chǔ)上增加"層"的屬性
firsttest <- matrix(c(46,21,50,30,25,50),nrow = 2)
secondtest <- matrix(c(46,43,41,35,50,50),nrow = 2)
tests <- array(data = c(firsttest,secondtest),dim = c(3,2,2))
tests
## , , 1
##
## [,1] [,2]
## [1,] 46 30
## [2,] 21 25
## [3,] 50 50
##
## , , 2
##
## [,1] [,2]
## [1,] 46 35
## [2,] 43 50
## [3,] 41 50
attributes(tests)
## $dim
## [1] 3 2 2
#取子集
tests[3,2,1]
## [1] 50
微信公眾號(hào)生信星球同步更新我的文章,歡迎大家掃碼關(guān)注畦幢!
我們有為生信初學(xué)者準(zhǔn)備的學(xué)習(xí)小組,點(diǎn)擊查看??
想要參加我的線上線下課程坎吻,也可加好友咨詢(xún)??
如果需要提問(wèn),請(qǐng)先看生信星球答疑公告