R语言apply函数家族

http://biobio2010.blogspot.com/2011/04/apply.html

R语言apply函数家族

首先apply函数并不是不循环,而是不在R里循环。它的循环是通过C实现的。

其次,它不一定比其它循环方式快。

个人认为,向量化 > apply > for 速度前者优于后者。

apply(X, margin, FUN, ...)

操作对象:matrix, array或data frame

操作方式:抽取matrix或data.frame的每行或每列,作为vector执行指定FUN

返 回 值:vector(如果FUN返回一个值), matrix(如果FUN返回一个固定长度的vector,按列排列),或list(如果FUN返回长度不同的vector)

实 例

mx=matrix(1:100,nrow=10)

apply(mx, 1, min) #对矩阵mx按第1下标-行-求最小值

apply(mx, 2, max) #对矩阵mx按第2下标-列-求最大值, colMeans(mx)

其 它

mx可以是多维array,magin也可以指定多个维度

mx=array(1:100,c(4,5,5))

apply(mx, 3, mean)#按第3下标求均值,mean(mx[,,1])

apply(mx, c(1,2), mean) #按第1,2下标求均值,mean(mx[1,1,])

FUN可以是任意函数,包括自定义函数及命令内部编写的函数

apply(mx, 2, function(x) mean(x, trim=0.1))

apply(mx, 2, function(x) c(median(x),mean(x)))

FUN的参数,可放在函数后面以传值给函数

apply(mx, 2, mean, trim=0.1)

lapply(X, FUN, ...)

操作对象:list, data.frame (不能用于matrix或array)

操作方式:针对list的每一个元素执行FUN (如果操作对象是data.frame,按列执行FUN)

返 回 值:与输入list等长的list

sapply(X, FUN, ..., simplify=T, USE.NAMES=T)

操作对象:list 简化版的lapply

操作方式:针对list的每一个元素执行FUN

返 回 值:vector, matrix或list

tapply(X, INDEX, FUN=NULL, ..., simplify=T)

操作对象:vector

操作方式:把vector根据INDEX(比如因子)分组,对每一组执行FUN

返 回 值:array或list

实 例

y = rnorm(100)

cat1 = gl(10,10,length=100,labels=LETTERS[1:10])

tapply(y,cat1,mean)

cat2 = gl(5,2,length=100,labels=letters[1:5])

tapply(y,list(cat1,cat2),mean)

sweet(mx,margin,stats,FUN,...)

操作对象:array

操作方式:把mx根据FUN操作stats指定的统计值

返 回 值:与第一参数相同维度的array

实 例

a = matrix(rnorm(100), 10)

sweet(a, 2, colMeans(a), "-") #a的所有元素减去其所在列的均值a[m,n]-mean(a[,n])

sweet(a, 1, rowSums(a), "/")

aggregate()

by()