举例子说明R中apply sapply lapply 的用法
1、数据准备
m <- matrix(data=cbind(rnorm(30, 0), rnorm(30, 2), rnorm(30, 5)), nrow=30, ncol=3)//通过rnorm(n,m)生成行数为n,平均为m的数据列。
method1 method2 method3
[1,] 0.05517714 0.014054038 0.017260447
[2,] 0.08367678 0.003570883 0.004289079
[3,] 0.05274706 0.028629661 0.071323030
[4,] 0.06769936 0.048446559 0.057432519
[5,] 0.06875188 0.019782518 0.080564474
[6,] 0.04913779 0.100062929 0.102208706
2、apply
平均
apply(m,1,mean)//行平均
apply(m,2,mean)//列平均
公式:function代替mean,求每一列中x<0 的个数
apply(m, 2, function(x) length(x[x<0]))
#[1] 14 1 0
function代替mean,求每一列中x<0 的个数
必须给length加个名字function(x),这样是不允许的,必须在function内包装好代码
apply(m, 2, length(x[x<0]))
#Error in match.fun(FUN) : object 'x' not found
apply(m, 2, function(x) mean(x[x>0]))
#[1] 0.4466368 2.0415736 4.8685779
function 目的是想求出matrix中的每一列是matrix还是Vector,答案是Vector
apply(m, 2, function(x) is.matrix(x))
#[1] FALSE FALSE FALSE
apply(m, 2, is.vector)
#[1] TRUE TRUE TRUE
3、sapply & lapply
通过一系列的list或者向量改造,对其中的每一项做一定的变化
sapply(1:3, function(x) x^2)
#[1] 1 4 9
//返回一个vector
lapply(1:3, function(x) x^2)
#[[1]]
#[1] 1
#
#[[2]]
#[1] 4
#
#[[3]]
#[1] 9
//返回一个list
//sapply加上一个simplify=F,sapply也能够返回list
sapply(1:3, function(x) x^2, simplify=F)
#[[1]]
#[1] 1
#
#[[2]]
#[1] 4
#
#[[3]]
#[1] 9
//lapply前加上unlist也能得到Vector
unlist(lapply(1:3, function(x) x^2))
#[1] 1 4 9
实际上,sapply是将1:3一个个的带入functionz中求值,然后返回,下面的例子同样实现的是每列求平均,但是在这个例子里就可以任意定义需要求平均的列了
sapply(1:3, function(x) mean(m[,x]))
[1] -0.02664418 1.95812458 4.86857792
或者
sapply(1:3, function(x, y) mean(y[,x]), y=m)
#[1] -0.02664418 1.95812458 4.86857792
这里的y值从sapply的可选参数中传入。
以上所有内容翻译自http://www.r-bloggers.com/using-apply-sapply-lapply-in-r/