Aliases: apply
### ** Examples ## Compute row and column sums for a matrix: x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) dimnames(x)[[1]] <- letters[1:8] apply(x, 2, mean, trim = .2)
x1 x2 3 3
col.sums <- apply(x, 2, sum) row.sums <- apply(x, 1, sum) rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums)))
x1 x2 Rtot a 3 4 7 b 3 3 6 c 3 2 5 d 3 1 4 e 3 2 5 f 3 3 6 g 3 4 7 h 3 5 8 Ctot 24 24 48
stopifnot( apply(x, 2, is.vector)) ## Sort the columns of a matrix apply(x, 2, sort)
x1 x2 [1,] 3 1 [2,] 3 2 [3,] 3 2 [4,] 3 3 [5,] 3 3 [6,] 3 4 [7,] 3 4 [8,] 3 5
## keeping named dimnames names(dimnames(x)) <- c("row", "col") x3 <- array(x, dim = c(dim(x),3), dimnames = c(dimnames(x), list(C = paste0("cop.",1:3)))) identical(x, apply( x, 2, identity))
[1] TRUE
identical(x3, apply(x3, 2:3, identity))
[1] TRUE
## Don't show: xN <- x; dimnames(xN) <- list(row=NULL, col=NULL) x2 <- x; names(dimnames(x2)) <- NULL fXY <- function(u) c(X=u[1], Y=u[2]) ax1 <- apply(x, 1, fXY) ax2 <- apply(x2,1, fXY) stopifnot(identical(dimnames(ax1), list(col=c("X.x1", "Y.x2"), row=letters[1:8])), identical(dimnames(ax2), unname(dimnames(ax1))), identical( x, apply( x, 2, identity)), identical(xN, apply(xN, 2, identity)), identical(dimnames(x), dimnames(apply(x, 2, format))), identical(x3, apply(x3, 2:3, identity)), identical(dimnames(apply(x3, 2:1, identity)), dimnames(x3)[3:1])) rm(xN, x2, fXY, ax1, ax2) ## End(Don't show) ##- function with extra args: cave <- function(x, c1, c2) c(mean(x[c1]), mean(x[c2])) apply(x, 1, cave, c1 = "x1", c2 = c("x1","x2"))
row a b c d e f g h [1,] 3.0 3 3.0 3 3.0 3 3.0 3 [2,] 3.5 3 2.5 2 2.5 3 3.5 4
ma <- matrix(c(1:4, 1, 6:8), nrow = 2) ma
[,1] [,2] [,3] [,4] [1,] 1 3 1 7 [2,] 2 4 6 8
apply(ma, 1, table) #--> a list of length 2
[[1]] 1 3 7 2 1 1 [[2]] 2 4 6 8 1 1 1 1
apply(ma, 1, stats::quantile) # 5 x n matrix with rownames
[,1] [,2] 0% 1 2.0 25% 1 3.5 50% 2 5.0 75% 4 6.5 100% 7 8.0
stopifnot(dim(ma) == dim(apply(ma, 1:2, sum))) ## Example with different lengths for each call z <- array(1:24, dim = 2:4) zseq <- apply(z, 1:2, function(x) seq_len(max(x))) zseq ## a 2 x 3 matrix
[,1] [,2] [,3] [1,] integer,19 integer,21 integer,23 [2,] integer,20 integer,22 integer,24
typeof(zseq) ## list
[1] "list"
dim(zseq) ## 2 3
[1] 2 3
zseq[1,]
[[1]] [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [[2]] [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [[3]] [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
apply(z, 3, function(x) seq_len(max(x)))
[[1]] [1] 1 2 3 4 5 6 [[2]] [1] 1 2 3 4 5 6 7 8 9 10 11 12 [[3]] [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [[4]] [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# a list without a dim attribute