R學習 第二篇:矩陣和數組


向量是一維的,只有行這一個維度,沒有其他維度。R可以創建更高維度的數據對象,例如,矩陣、數據框、數組,索引高維度的對象時,需要使用元素的下標。這些對象的下標都使用中括號[]和索引,第一個維度是row,第二個維度是column,維度依次增加,索引的格式是:var[row,column,,,]。數組是二維或多維(三維或多於三維),二維數組叫做矩陣。數組元素的類型是相同的,每個維度的元素數量是相同的。數據框是二維對象,每個數據列的數據類型是相同的,不同數據列的數據類型可以不同。

一,數組(array)

R使用arrary()函數創建數組,該函數至少需要兩個向量參數:數組的元素值(data)向量,和維度(dim)向量,第三個參數是可選的維度名(dimnames)向量。數據(data)參數是數組的所有元素值向量,維度參數(dim)指定各個維度的元素數量,維度名(dimnames)參數是可選的,用於指定各個維度的名稱。

array(data = NA, dim = length(data), dimnames = NULL)

數組的維度是有順序的,維度參數(dim)的第一個維度是row,第二個維度是column,第三個維度是high,以此類推,數組是按照維度的順序把數據(data)參數的數據填充到數組中。

嚴格來說,數組(或矩陣)的長度和維度是固定的,因此不能增加或刪除行或列,但可以通過為數組(或矩陣)重新賦值來實現行或列的增加或刪除。

1,創建數組

示例:data=c(1:12),dim=c(2:3:2),這說明,數組共有:第一維是2行,第二維是3列,第三維是2項(item),參數dimnames為三個維度的row,column和itme命名。

> three_d_array=array(
+     data=c(1:12),
+     dim=c(2,3,2),
+     dimnames=list(
+         c('r1','r2'),
+         c('c1','c2','c3'),
+         c('h1','h2')
+         )
+     )

打印的結果如下,其中“ , , h1”,表示第三維的第一個item,數組按照(1,1,1),(2,1,1),(1,2,1),,的順序填充元素值。

, , h1
   c1 c2 c3
r1  1  3  5
r2  2  4  6

, , h2
   c1 c2 c3
r1  7  9 11
r2  8 10 12

2,數組的維度和長度

函數dim()返回數組的各個維度的長度,輸出的結果按照維度的順序依次顯示:

> dim(three_d_array)
[1] 2 3 2

特別地,函數nrow(),ncol(),用於返回數組的第一個維度,第二個維度的長度:

> nrow(three_d_array)
[1] 2
> ncol(three_d_array)
[1] 3

把函數nrow(),ncol(),dim()應用於向量時,將返回NULL值,R提供另外兩個函數NROW(), NCOL(),用於返回數組、矩陣和數據框的第一個維度,第二個維度的長度,這兩個函數把向量看作是一維的矩陣。

函數length(),用於返回數組的長度,是數組的各個維度的乘積:

> length(three_d_array)
[1] 12

3,數組的維度的名稱

數據和矩陣的每個維度都有名稱,使用函數rownames(),colnames()查看數組、矩陣的各行的名稱和各列的名稱:

> rownames(three_d_array)
[1] "r1" "r2"
> colnames(three_d_array)
[1] "c1" "c2" "c3"

使用函數dimnames(x)查看對象的所有維度的名稱:

> dimnames(three_d_array)
[[1]]
[1] "r1" "r2"

[[2]]
[1] "c1" "c2" "c3"

[[3]]
[1] "h1" "h2"

二,矩陣(matrix)

矩陣是二維數組的特例,本質上也是二維數組。使用函數matrix()創建矩陣,必須傳遞的參數是數據(data)向量,行數(nrow)或列數(ncol),可選的參數是dimnames參數和byrow參數。

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

byrow參數的默認值是FALSE,表示按照列填充矩陣,這意味着,R首先填充第一列的所有行,再填充第二列的所有行,以此類推:

> a_matrix=matrix(
+     data=c(1:6),
+     nrow=2,
+     byrow=FALSE,
+     dimnames = list(
+         c('r1','r2'),
+         c('c1','c2','c3')
+     )
+ )

返回的結果如下,矩陣使用data參數,先填充位置(1,1),再填充位置(2,1),以此類推:

> a_matrix
   c1 c2 c3
r1  1  3  5
r2  2  4  6

矩陣只有兩個維度,行(row)和列(column),可以使用nrow,ncol,dim函數獲得矩陣各個維度的長度,可以使用length函數獲得矩陣的長度,即矩陣的元素總數量。

三,索引數組和矩陣

R使用中括號[]表示索引,有四種指定索引的方法(正整數,負整數,邏輯值和元素的名稱),下標的整數值從1開始,正整數表示選擇該項,負整數表示剔除該項。在不同的維度上用不同的方式指定索引下標,是有效的,每個維度的下標使用逗號分割。如果相應的維度上,下標為空,那么表示該維度的所有元素。索引矩陣和數組的方法相同,只不過矩陣的維度比數組的維度多一個。

1,使用下標索引數組

例如,索引數組,包含所有的行(row),第一個維度的下標是空;選擇第二個維度的第1,2列,第二個維度的下標是向量c(1:2);選擇第三維度的第一項(item),第三個維度的下標是1:

> three_d_array[,1:2,1]
   c1 c2
r1  1  3
r2  2  4

2,使用元素的名稱索引數組

例如,索引數組,包含素有的行(row),第一個維度的下標是空;選擇第二個維度的第1,2列,第二個維度的下標是向量c("c1","c2");選擇第三個維度的第2個元素,第三個維度的下標是"h2"

> three_d_array[,c("c1","c2"),"h2"]
   c1 c2
r1  7  9
r2  8 10

3,使用邏輯值所有數組

匹配操作符 %in%, 如果左側的向量的元素能夠匹配右側的向量中的任意元素,那么返回TRUE,否則,返回FALSE。

> cols <- colnames(three_d_array) %in% c("c1","c2")
> cols
[1]  TRUE  TRUE FALSE
> hs <- as.vector(dimnames(three_d_array)[[3]]) %in% c("h1")
> hs
[1]  TRUE FALSE
> three_d_array[,cols,hs]
   c1 c2
r1  1  3
r2  2  4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM