矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数。所以矩阵也和向量一样,有模式的概念,例如数值型和字符型。(但反过来,向量却不能看作是只有一列或一行的矩阵。)
矩阵可通过函数matrix创建矩阵,一般使用格式为:
mymatrix = matrix( vector, nrow = rowNumber, ncol = columnNumber, byrow = logicalValue, dimnames=list( VectorRowName, VectorColumnName ) )
其中,vector包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选的、以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。
►创建矩阵
矩阵的行和列的下标都从1开始。例如矩阵a左上角的元素记作a[1, 1]。矩阵在R中是按列存储的,也就是说先存储第一列,再存储第二列,以此类推。
方法一:创建矩阵的方法之一就是使用matrix()函数:
> y = matrix( c(1,2,3,4), nrow=2, ncol=2)
> y
[,1] [,2]
[1,] 1 3
[2,] 2 4
> y[, 2]
[1] 3 4
> y[2, ]
[1] 2 4
这里把第一列(即1和2)与第二列(3和4)连接在一起。因此数据是(1,2,3,4)。然后我们给出行数和列数。由于R是按列存储的,这就决定了这四个数在矩阵中的位置。上例指定了矩阵中全部的4个元素,因此没必要同时设定列数ncol和行数nrow这两个参数,只需要给出其中一个就够了。4个元素排成两行,就意味着列数为2。
> matrix( c(1,2,3,4), nrow=2)
[,1] [,2]
[1,] 1 3
[2,] 2 4
> matrix( c(1,2,3,4), ncol=2)
[,1] [,2]
[1,] 1 3
[2,] 2 4
方法二:另外一种创建矩阵的方法是为矩阵的每一个元素赋值:
> y = matrix(nrow=2, ncol=2)
> y[1, 1] <- 1
> y[2, 1] <- 2
> y[1, 2] <- 3
> y[2, 2] <- 4
> y
[,1] [,2]
[1,] 1 3
[2,] 2 4
用这种方法需要事先向R声明y是一个矩阵,并且给出它的行数和列数。
尽管R的矩阵是按列存储的,但是可以通过把matrix()的byrow参数设置为TRUE,使矩阵元素按行排列。以下是使用byrow的一个例子:
> m = matrix( c(1,2,3,4,5,6), nrow=2, byrow=T)
> m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
尽管这样设置,但是矩阵本身依然是按列存储的,参数byrow改变的只是数据输入的顺序。当读取的数据文件是按这种方式组织时,可能会更方便。
> vector <- c( 1:4 )
> vrnames <- c( "row1", "row2" )
> vcnames <- c( "col1", "col2" )
> matrix( vector, nrow=2, byrow=TRUE, dimnames=list( vrnames, vcnames ) )
col1 col2
row1 1 2
row2 3 4
►一些函数
Ю nrow( z ):返回矩阵的行数
Ю ncol( z )返回矩阵的列数
Ю dim( z ):是一个由矩阵的行数和列数组成的向量
Ю attributes( z ):返回属性值
Ю as.matrix( x ):函数将向量转化为矩阵。
►矩阵行和列的命名问题
访问矩阵元素最直接的方法是通过行号和列号,但也可以使用行名和列名,这些名称用来访问指定的列。
> z <- matrix( 1:6, nrow=2 )
> colnames( z )
NULL
> colnames( z ) <- c( "a", "b", "c" )> z
> colnames( z )
[1] "a" "b" "c"
> z[ , "b" ]
[1] 3 4