############## # Section 10 ############## set.seed(98) mymat <- matrix(rnorm(16), nc=4) mymat max(mymat) # Row-wise operation (and column-wise operations) rowmaxes <- apply(mymat,1,max) colmaxes <- apply(mymat,2,max) rowmeans <- apply(mymat,1,mean) # Some row-wise and column-wise operations have built-in shortcut functions: simpmat = matrix(1:16,byrow=T,nrow=4,ncol=4) simpmat colSums(simpmat) colMeans(simpmat) rowSums(simpmat) rowMeans(simpmat) ## can do more complicated row and column summing with an multidimensional array: dim(UCBAdmissions) print(UCBAdmissions) rowSums(UCBAdmissions); rowSums(UCBAdmissions, dims = 2) colSums(UCBAdmissions); colSums(UCBAdmissions, dims = 2) # Using 'apply': apply(UCBAdmissions,1,sum) apply(UCBAdmissions,2,sum) apply(UCBAdmissions,3,sum) apply(UCBAdmissions,c(1,2),sum) apply(UCBAdmissions,c(1,3),sum) apply(UCBAdmissions,c(2,3),sum) #Item by item comparison a=c(1,5,7,8); b=c(4,7,2,11) pmax(a,b) # Row-wise operation with missing value mymat <- cbind(mymat, c(0,1,2,NA)) mymat rowmaxes <- apply(mymat,1,max) rowmaxes <- apply(mymat,1,max,na.rm=T) #Row-wise operation using a factor tapply(state.x77[,"Murder"],state.region,mean) by(state.x77[,"Murder"],state.region,mean) tapply(state.x77[,"Illiteracy"],state.region,mean) tapply(state.x77[,"Murder"],state.region,cummax) # Can do medians by region too: Income <-state.x77[,"Income"] medinc.byreg <- tapply(Income,state.region,median) medinc.byreg # for and while loops: mymat <- matrix(1:16, nc=4) newmat<-matrix(0, nc=4, nr=4) for (j in 1:ncol(mymat)) { newmat[,j]<-(j+1)*mymat[,j] } newmat j=1; while (j <= ncol(mymat)) { newmat[,j]<-(j+1)*mymat[,j] j <- j+1 } newmat # Iteration mymat <- matrix(rnorm(49), nc=7) rowmaxes=NULL # or rowmaxes=c() rowabsmax=NULL diffabsmax=NULL for (j in 1:nrow(mymat)) { rowmaxes[j]=max(mymat[j,]) rowabsmax[j]=max(abs(mymat[j,])) diffabsmax[j]=rowabsmax[j]-rowmaxes[j]} hist(diffabsmax) #machine epsilon x=.5 while(x!=0){y=x; x=x/2} x y # "Outer products" of two vectors myvec1 <- c(1,2,3) myvec2 <- c(5,6,7) outer(myvec1,myvec2,"*") # Equivalently: myvec1 %o% myvec2 # An "outer sum" outer(myvec1,myvec2,"+") # A table of selected powers outer(myvec2, myvec1, "^") month.abb outer(month.abb, 2014:2018, FUN = "paste")