在”矩阵运算及常用函数I“里已经提到过,apply系列函数“主要用于某维度上某函数/方法的批量应用”,可以避免“控制流循环带来的高错误率以及漫长的响应时间”。
为了比较响应时间,我们可以先做一个简单的测试:为一列数据做一一系列幂的变形,依据指数的sequence,生成一系列的新数据。然后用system.time()来测试运行的时间(如何解读system.time()结果)。
test1. for循环
> power1 <- function(var = EuStockMarkets[,1]){
+ new.var <- NULL
+ for(i in seq(.001, .999, .001)){
+ if(is.null(new.var)){
+ new.var <- var^i
+ }else{
+ new.var <- data.frame(new.var, var^i)
+ }
+ }
+ return(new.var)
+ }
+ new.var <- NULL
+ for(i in seq(.001, .999, .001)){
+ if(is.null(new.var)){
+ new.var <- var^i
+ }else{
+ new.var <- data.frame(new.var, var^i)
+ }
+ }
+ return(new.var)
+ }
> system.time(power1())
user system elapsed
1.06 0.00 1.08
这里elapsed说明调用和运行程序到整体执行完一共花费的时间,这段循环的function花费了1.08秒
test2. sapply
> power2<-function(i)EuStockMarkets[,1]^i
> system.time(sapply(seq(.001,.999,.001),power2))
user system elapsed
0.42 0.00 0.42
0.42 0.00 0.42
这个地方, 当我们使用sapply进行处理的时候,总共消耗了0.42秒,比for循环快了一倍多,虽然只快了不到一秒,但是执行效率有相当大幅度的提升。当处理的维度变得原来越多的时候(比如for的循环嵌套),apply函数的优势就会更明显。
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
-+-
在help system中搜索apply
> ??apply
可以看到在{base}中自带的跟apply相关的函数有7个:
base::apply | Apply Functions Over Array Margins |
base::by | Apply a Function to a Data Frame Split by Factors |
base::eapply | Apply a Function Over Values in an Environment |
base::lapply | Apply a Function over a List or Vector |
base::mapply | Apply a Function to Multiple List or Vector Arguments |
base::rapply | Recursively Apply a Function to a List |
base::tapply | Apply a Function Over a Ragged Array |