Working with Vectors and Matrices in R
This session is intended to introduce some of the features in R for dealing with vectors and matrices. We will be using these features throughout the semester, so learn this stuff well.
Vectors
R handles vector objects quite easily and intuitively.
x<-c(1,3,2,10,5) #create a vector x with 5 components
x
y<-1:5 #create a vector of consecutive integers
y
y+2 #scalar addition
2*y #scalar multiplication
y^2 #raise each component to the second power
2^y #raise 2 to the first through fifth power
y #y itself has not been unchanged
y<-y*2
y #it is now changed
More examples of vector arithmetic:
x<-c(1,3,2,10,5); y<-1:5 #two or more statements are separated by semicolons
x;y
x+y
x*y
x/y
x^y
sum(x) #sum of elements in x
cumsum(x) #cumulative sum vector
diff(x) # first difference
diff(x,2) #second difference
max(x) #maximum
min(x) #minimum
Sorting can be done using sort() command:
x
sort(x) # increasing order
sort(x, decreasing=T) # decreasing order
Component extraction is a very important part of vector calculation.
x
length(x) # number of elements in x
x[3] # the third element of x
x[3:5] # the third to fifth element of x, inclusive
x[-2] # all except the second element
x[x>3] # list of elements in x greater than 3
Logical vectors can be handy:
x>3
as.numeric(x>3) # as.numeric() function coerces logical components to numeric
sum(x>3) # number of elements in x greater than 3
(1:length(x))[x<=2] # indices of x whose components are less than or equal to 2
z<-as.logical(c(1,0,0,1)) # numeric to logical vector conversion
z
Character vector:
colors<-c("green", "blue", "orange", "yellow", "red")
colors
Individual components can be named and referenced by their names.
names(x) # check if any names are attached to x
names(x)<-colors # assign the names using the character vector colors
names(x)
x
x["green"] # component reference by its name
names(x)<-NULL # names can be removed by assigning NULL
x
seq() and rep() provide convenient ways to a construct vectors with a certain pattern.
seq(10)
seq(0,1,length=10)
seq(0,1,by=0.1)
rep(1,3)
c(rep(1,3),rep(2,2),rep(-1,4))
rep("Small",3)
c(rep("Small",3),rep("Medium",4))
rep(c("Low","High"),3)
Matrices
A matrix refers to a numeric array of rows and columns. One of the easiest ways to create a matrix is to combine vectors of equal length using cbind(), meaning "column bind":
x
y
m1<-cbind(x,y);m1
t(m1) # transpose of m1
m1<-t(cbind(x,y)) # Or you can combine them and assign in one step
m1
dim(m1) # 2 by 5 matrix
m1<-rbind(x,y) # rbind() is for row bind and equivalent to t(cbind()).
m1
Of course you can directly list the elements and specify the matrix:
m2<-matrix(c(1,3,2,5,-1,2,2,3,9),nrow=3);m2
Note that the elements are used to fill the first column, then the second column and so on. To fill row-wise, we specify byrow=T option:
m2<-matrix(c(1,3,2,5,-1,2,2,3,9),ncol=3,byrow=T);m2
Extracting the components of a matrix involves one or two indices.
m2
m2[2,3] #element of m2 at the second row, third column
m2[2,] #second row
m2[,3] #third column
m2[-1,] #submatrix of m2 without the first row
m2[,-1] #ditto, sans the first column
m2[-1,-1] #submatrix of m2 with the first row and column removed
Matrix computation is usually done component-wise.
m1<-matrix(1:4, ncol=2); m2<-matrix(c(10,20,30,40),ncol=2)
m1; m2
2*m1 # scalar multiplication
m1+m2 # matrix addition
m1*m2 # component-wise multiplication
Note that m1*m2 is NOT the usual matrix multiplication. To do the matrix multiplication, you should use %*% operator instead.
m1 %*% m2
solve(m1) #inverse matrix of m1
solve(m1)%*%m1 #check if it is the inverse
diag(3) #diag() is used to construct a k by k identity matrix
diag(c(2,3,3)) #or other diagonal matrices
Rank of a matrix. There is no rank command, as in some packages.
However, you can get the rank of a matrix using the qr factorization
qr(m1)$rank # Returns the matrix rank.
det(m1); det(m2) #Calculate the determinant of a matrix using det()
eigen(m2) #Eigenvalues and eigenvectors of a matrix is handled by eigen() function:
Matrix Factorization
m <- matrix(c(5,1,1,3),2,2) # Create a matrix known to be symmetrical and positive definite
m
cm <- chol(m) # Compute the choleski factorization of m.
cm
Check the choleski factorization of m, i.e,. cm'%*%cm=m and cm%*%cm=m
t(cm) %*% cm #-- = 'm'
crossprod(cm) #-- = 'm'
The Singular Value Decomposition of a rectangular matrix X is computed by
X = U D V',
where U and V are orthogonal, V' means V transposed, and D is a diagonal matrix with the singular values D[i,i].
Equivalently, D = U' X V. Note that this is useful for diagonalizing a matrix.
hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, "+") } # Create a Hilbert matrix for fun.
X <- hilbert(9)[,1:6]
s <- svd(X)
s
Check the factorization
D <- diag(s$d)
s$u %*% D %*% t(s$v) # X = U D V'
t(s$u) %*% X %*% s$v # D = U' X V
D