#----------------------------------- # AAK: Sat 15 Aug 2014 00:48:44 PDT # Loop operators in R #----------------------------------- x <- list(a=1:10, b=rnorm(20)) #Applies the function mean on each element of the list: y <- lapply(x,mean) x <- 1:4 y <- lapply(x,runif) # Passing arguments to runif y <- lapply(x,runif,min=0,max=10) # sapply is the same as lapply but the result is simplified (in its type) x <- matrix(rnorm(200),20,10) # returns the mean of the columns: y <- apply(x,2,mean) # returns the sum of the rows: y <- apply(x,1,sum) # in apply(Matrix,I,FUNC), I is the index that is preserved # mapply is multivariable apply, noise <-function(n,mean,std){ rnorm(n,mean,std) } # Imagine we want to create all the combination of # n=(1,2,3,4,5) and means=(1,1.5,2,2.5,3) y <- mapply(noise,1:5,seq(1,3.0,0.5),1.0) # tapply applies the function on portions of a vector x <- c(rnorm(100), runif(100), rnorm(100,2)) # Creates a factor with 3 levels 1x100, 2x100, 3x100 indx <- gl(3,100) means <- tapply(x,indx,mean) # returns the mean of each group (levels) i.e here 3 numbers: print(means) # Using factor you can also split a vector: y <- split(x,indx) print(summary(y)) library(datasets) # Example using airquality dataset, splitting data frame: s <- split(airquality, airquality$Month) # Note the on the fly function definition: res <- sapply(s, function(x) colMeans(x[,c("Ozone", "Solar.R","Wind")], na.rm=TRUE)) print(res) # Example using data frames: library(datasets) # See mtcars data frame # Returns the average of car's mpg for each cyl group (4, 5, 6 cyldender) cylmean <- tapply(mtcars$mpg,mtcars$cyl,mean) print(cylmean)