apply()函数
函数可以应用于一系列的数据对象上,包括标量,向量,矩阵,数组,数据框。
将函数应用于数据对象。
apply函数是最常用的代替for循环的函数。
a <- 5
sqrt(a)
b <- c(1.2,222,30.34)
round(b)
c <- matrix(runif(12),nrow = 3)
log(c)
mean(c)
这里mean()求得是矩阵中12个元素的均值。
如果需要求得是矩阵中每列每行的均值,可以用R中的apply()函数,可将一个任意函数“应用”到矩阵、数组、数据框的任何维度上。
apply()函数的使用格式为:apply(X, MARGIN, FUN, …)
Arguments
X : an array, including a matrix.
MARGIN : a vector giving the subscripts which the function will be applied over. E.g., for a matrix 1 indicates rows, 2 indicates columns, c(1, 2) indicates rows and columns. Where X has named dimnames, it can be a character vector selecting dimension names.
FUN : the function to be applied: see ‘Details’. In the case of functions like +, %%, etc., the function name must be backquoted or quoted.
… : optional arguments to FUN.*
X为数据对象,MARGIN是维度的下标,FUN 是由你指定的函数,而…则包括了任何想传递给FUN的参数。
在矩阵或者数据框中,MARGIN=1代表行,MARGIN=2表示列。
请看以下例子:
mydata <- matrix(rnorm(30),nrow = 6)
apply(mydata,1,mean)
apply(mydata,2,mean)
首先生成了一个包含正太随机数的6*5矩阵。然后计算了6行的均值,以及5列的均值。
FUN可为任意R函数,这也包括自行编写的函数,所以apply()是一种很强大的机制。apply()可把函数应用于数据的某个维度上,而lapply()和sapply()则可将函数应用到列表上。
lapply()和sapply()
lapply returns a list of the same length as X, each element of which is the result of applying FUN to the corresponding element of X.
sapply is a user-friendly version and wrapper of lapply by default returning a vector, matrix or, if simplify = “array”, an array if appropriate, by applying >simplify2array(). sapply(x, f, simplify = FALSE, USE.NAMES = FALSE) is the same as lapply(x, f).
lapply 返回与原始集合长度相同的列表对象,其每个元素都是将FUN应用于列表的相应元素的结果。
sapply代表simplified [l]apply,是易于使用的版本,可以将结果整理以向量,矩阵,列表的形式输出。
Usage lapply(X, FUN, …)
sapply(X, FUN, …, simplify = TRUE,USE.NAMES = TRUE)
vapply(X, FUN, FUN.VALUE, …, USE.NAMES = TRUE)
这两个函数很想, 都是应用于向量或列表。上面的apply应用于数组或矩阵,所以通常apply()需要3个参数,而lapply()和sapply()需要2个参数, 第一个参数是输入数据,第二个参数是FUN。两者的区别在于返回值上面,sapply返回的是一个向量,lapply返回的是列表。
如果sapply()的参数 simplify=FALSE和USE.NAMES=FALSE,那么完全sapply函数就等于lapply函数了。