R語(yǔ)言編程藝術(shù) 第3章 矩陣

矩陣是一種特殊的向量,包括兩個(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)先看生信星球答疑公告

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宇葱,一起剝皮案震驚了整個(gè)濱河市瘦真,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黍瞧,老刑警劉巖诸尽,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異印颤,居然都是意外死亡您机,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)膀哲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)往产,“玉大人,你說(shuō)我怎么就攤上這事某宪》麓澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵兴喂,是天一觀的道長(zhǎng)蔼囊。 經(jīng)常有香客問(wèn)我焚志,道長(zhǎng),這世上最難降的妖魔是什么畏鼓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任酱酬,我火速辦了婚禮,結(jié)果婚禮上云矫,老公的妹妹穿的比我還像新娘膳沽。我一直安慰自己,他們只是感情好让禀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布挑社。 她就那樣靜靜地躺著,像睡著了一般巡揍。 火紅的嫁衣襯著肌膚如雪痛阻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天腮敌,我揣著相機(jī)與錄音阱当,去河邊找鬼。 笑死糜工,一個(gè)胖子當(dāng)著我的面吹牛弊添,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啤斗,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼表箭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了钮莲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤彼水,失蹤者是張志新(化名)和其女友劉穎崔拥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凤覆,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡链瓦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盯桦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慈俯。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拥峦,靈堂內(nèi)的尸體忽然破棺而出贴膘,到底是詐尸還是另有隱情,我是刑警寧澤略号,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布刑峡,位于F島的核電站洋闽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏突梦。R本人自食惡果不足惜诫舅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宫患。 院中可真熱鬧刊懈,春花似錦、人聲如沸娃闲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畜吊。三九已至泽疆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玲献,已是汗流浹背殉疼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捌年,地道東北人瓢娜。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像礼预,于是被迫代替她去往敵國(guó)和親眠砾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容