1.3 Subsetting a matrix
To subset a matrix, we use [ ]:
A=matrix(1:9, 3, 3) #3 rows, 3 columns
#get the first and second rows of A
#it's a 2x3 matrix
A[1:2,] [,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
#get the top 2 rows and left 2 columns
A[1:2,1:2] [,1] [,2]
[1,] 1 4
[2,] 2 5
#What does this do?
A[c(1,3),c(1,3)] [,1] [,2]
[1,] 1 7
[2,] 3 9
#This?
A[c(1,2,1),c(2,3)] [,1] [,2]
[1,] 4 7
[2,] 5 8
[3,] 4 7
If you have used matlab, you know you can say something like A[1,end] to denote the element of a matrix in row 1 and the last column. R does not have `end’. To do, the same in R you do something like:
A=matrix(1:9, 3, 3)
A[1,ncol(A)][1] 7
#or
A[1,dim(A)[2]][1] 7
Warning R will create vectors from subsetting matrices!
One of the really bad things that R does with matrices is create a vector if you happen to subset a matrix to create a matrix with 1 row or 1 column. Look at this:
A=matrix(1:9, 3, 3)
#take the first 2 rows
B=A[1:2,]
#everything is ok
dim(B)[1] 2 3
class(B)[1] "matrix" "array"
#take the first row
B=A[1,]
#oh no! It should be a 1x3 matrix but it is not.
dim(B)NULL
#It is not even a matrix any more
class(B)[1] "integer"
#and what happens if we take the transpose?
#Oh no, it's a 1x3 matrix not a 3x1 (transpose of 1x3)
t(B) [,1] [,2] [,3]
[1,] 1 4 7
#A%*%B should fail because A is (3x3) and B is (1x3)
A%*%B [,1]
[1,] 66
[2,] 78
[3,] 90
#It works? That is horrible!This will create hard to find bugs in your code because you will look at B=A[1,] and everything looks fine. Why is R saying it is not a matrix! To stop R from doing this use drop=FALSE.
B=A[1,,drop=FALSE]
#Now it is a matrix as it should be
dim(B)[1] 1 3
class(B)[1] "matrix" "array"
#this fails as it should (alerting you to a problem!)
try(A%*%B)Error in A %*% B : non-conformable arguments