今天筆記內(nèi)容包含R語言中矩陣和數(shù)組基礎(chǔ)知識(shí)。
R語言矩陣創(chuàng)建矩陣矩陣內(nèi)可以是數(shù)字、符號(hào)、數(shù)學(xué)式,類似于常見的二維數(shù)組,有m行(row)n列(col)的矩陣m×n。 R 語言的矩陣可以使用 matrix() 函數(shù)來創(chuàng)建,語法格式如下:matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL) 參數(shù)說明: byrow 邏輯值,為 FALSE 按列排列,為 TRUE 按行排列 dimname 設(shè)置行和列的名稱,該參數(shù)用含有兩個(gè)向量(字符串)的列表組成。
> # 按行排列創(chuàng)建矩陣 > zhen_1 = matrix(c(1:12),nrow = 3,byrow = TRUE) > print(zhen_1) [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 5 6 7 8 [3,] 9 10 11 12 > # 定義行和列的名稱 > rownames_1 = c("a1","a2","a3") > colnames_2 = c("b1","b2","b3","b4") > # 輸出矩陣 > out_1 = matrix(c(1:12),nrow = 3,byrow = TRUE,dimnames = list(rownames_1,colnames_2)) > print(out_1) b1 b2 b3 b4 a1 1 2 3 4 a2 5 6 7 8 a3 9 10 11 12
轉(zhuǎn)置矩陣R 語言矩陣提供了t() 函數(shù),可以實(shí)現(xiàn)矩陣的行列互換,變化效果如下: 我們對(duì)剛剛創(chuàng)建的out_1 矩陣進(jìn)行轉(zhuǎn)置后輸出,如下:
> out_1 = matrix(c(1:12),nrow = 3,byrow = TRUE,dimnames = list(rownames_1,colnames_2)) > print(out_1) b1 b2 b3 b4 a1 1 2 3 4 a2 5 6 7 8 a3 9 10 11 12 > print(t(out_1)) #輸出轉(zhuǎn)置矩陣用t() a1 a2 a3 b1 1 5 9 b2 2 6 10 b3 3 7 11 b4 4 8 12
調(diào)用矩陣元素可以元素的列索引和行索引,類似坐標(biāo)形式,獲取矩陣元素,如下: > print(out_1) #獲取整個(gè)矩陣 b1 b2 b3 b4 a1 1 2 3 4 a2 5 6 7 8 a3 9 10 11 12 > print(out_1[1,2]) # 獲取第1行第2列的元素 [1] 2 > print(out_1[2,]) # 獲取第2行的元素 b1 b2 b3 b4 5 6 7 8
矩陣的計(jì)算大部分人已經(jīng)學(xué)過線性代數(shù),了解矩陣的加減乘除法則,值得注意的是只有行和列數(shù)都相同的矩陣才能加減運(yùn)算,只有第一個(gè)矩陣的列數(shù)等于第二個(gè)矩陣的行數(shù)才能相乘。接下來進(jìn)行演示: > # 矩陣相加,相減只需把加號(hào)改成減號(hào) > out_sum = m_1 + m_2 # 兩個(gè)矩陣都是2×3 > cat("結(jié)果:","\n") 結(jié)果: > print(out_sum) [,1] [,2] [,3] [1,] 14 -2 4 [2,] 18 8 6 > # 矩陣相乘 > out_cheng = m_1 * m_2 > cat("結(jié)果:","\n") 結(jié)果: > print(out_cheng) [,1] [,2] [,3] [1,] 49 1 4 [2,] 81 16 9 > # 矩陣相除 > out_chu = m_1 / m_2 > cat("結(jié)果:","\n") 結(jié)果: > print(out_chu) [,1] [,2] [,3] [1,] 1 1 1 [2,] 1 1 1
數(shù)組R 語言可以創(chuàng)建一維或多維數(shù)組,數(shù)組是一個(gè)同一類型的集合,矩陣就是一個(gè)二維數(shù)組。 數(shù)組創(chuàng)建使用array() 函數(shù),該函數(shù)使用向量作為輸入?yún)?shù),可以使用 dim 設(shè)置數(shù)組維度。語法格式如下:
array(data = NA, dim = length(data), dimnames = NULL)
- dim 數(shù)組的維度,默認(rèn)是一維數(shù)組。
- dimnames 維度的名稱,必須是個(gè)列表
例如創(chuàng)建一個(gè)3×3的二維數(shù)組,用于后續(xù)演示,方法如下: > v1 = c(1,2,3) > v2 = c(4,5,6,7,8,9) > shuzu = array(c(v1,v2),dim = c(3,3,2)) > print(shuzu) , , 1
[,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9
, , 2
[,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9
> column.names = c("col1","col2","col3") #設(shè)置列名 > row.names = c("row1","row2","row3") #設(shè)置行名 > matrix.names = c("m1","m2") #設(shè)置矩陣名 > out_3 = array(c(v1,v2),dim = c(3,3,2),dimnames = list(row.names,column.names,matrix.names)) #設(shè)置數(shù)組名 > print(out_3) #輸出 , , m1
col1 col2 col3 row1 1 4 7 row2 2 5 8 row3 3 6 9
, , m2
col1 col2 col3 row1 1 4 7 row2 2 5 8 row3 3 6 9 #上述m1和m2矩陣應(yīng)用于筆記后面的演示,不再重復(fù)
數(shù)組的元素有坐標(biāo)位置,索引順序?yàn)椋ㄐ?,列,維度),例如[3,2,4] 表示第4個(gè)矩陣第3行第2列的元素。 , , m2 #第二個(gè)矩陣
col1 col2 col3 row1 1 4 7 row2 2 5 8 row3 3 6 9
> print(out_3[3,1,2]) [1] 3 #輸出結(jié)果正確
可以通過訪問矩陣的元素來訪問數(shù)組,例如從數(shù)組中的一個(gè)矩陣創(chuàng)建新矩陣,然后進(jìn)行矩陣加減運(yùn)算,演示如下: > matrix_1 = shuzu[,,1] > matrix_2 = shuzu[,,2] > sum_1 = matrix_1 + matrix_2 > print(sum_1) [,1] [,2] [,3] [1,] 2 8 14 [2,] 4 10 16 [3,] 6 12 18
apply() 函數(shù)能夠?qū)?shù)組跨緯度計(jì)算,語法格式為:apply(x, margin, fun)
- margin 數(shù)據(jù)名稱(1代表行,2代表列,c(1,2)代表行和列)
> print(shuzu) , , 1 #數(shù)組的第一個(gè)矩陣 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9
, , 2 #數(shù)組的第二個(gè)矩陣 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9
> out_4 = apply(shuzu,1,sum) #對(duì)數(shù)組所有矩陣按照每一行的方式求和 > print(out_4) [1] 24 30 36 #第一行數(shù)據(jù)24=1+4+7+1+4+7,確實(shí)能行! 快速記憶: # 計(jì)算數(shù)組中所有矩陣對(duì)應(yīng)行的數(shù)字之和 result <- apply(shuzu, c(1), sum) # 計(jì)算數(shù)組中所有矩陣對(duì)應(yīng)列的數(shù)字之和 result <- apply(shuzu, c(2), sum) # 計(jì)算數(shù)組中每個(gè)矩陣內(nèi)部的所有數(shù)字之和 result <- apply(shuzu, c(3), sum)
|