向量是一維的,只有行這一個維度,沒有其他維度。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