R中的各种APPLY函数(批量处理,灰常好玩)
批量处理宽表矩阵数据时,这东西特有帮助。 当不需要多进程的情况, 用apply来个多线程并行处理也不错啊。
但它还是有个缺点,不能在内部修改外部变量,但可以读取外部变量。没有java多线程的那种线程共享机制,但对于
简单的并行处理还是很有帮助的。
apply function
apply(array, margin, function, ...)
用途:
将指定function应用到指定array的指定margin(维度)上。
例子:
> data <- cbind(c(1,2),c(3,4)) > data.rowsum <- apply(data,1,sum) > data.colsum <- apply(data,2,sum) > data
[,1] [,2]
[1,] 1 3
[2,] 2 4
> data.rowsum
[1] 4 6
> data.colsum
[1] 3 7
lapply function
lapply(list, function, ...)
用途:
主要用于处理data frame,因为R中data frame被认为是一个包含变量名(列名称)和变量值(列向量)的list,用lapply可以很方便的将指定function应用到data frame中所有变量上。注意:lapply的结果也是一个list。
例子:
> data.df <- as.data.frame(data) > colnames(data.df) <- c("VAR1","VAR2") > is.list(data.df)
[1] TRUE
> data.df.avg <- lapply(data.df,mean) > is.list(data.df.avg)
[1] TRUE
> data.df.avg
$VAR1
[1] 1.5
$VAR2
[1] 3.5
sapply function
sapply(list, function, ..., simplify)
用途:
跟lapply类似,同样是应用指定function到指定list。不过当simplify=TRUE(默认)时,输出会根据结果简化为vector或者matrix。当simplify=FALSE时,输出通lapply一样为list。
例子:
> data.df.max <- sapply(data.df,max) > is.vector(data.df.max)
[1] TRUE
> data.df.max
VAR1 VAR2
2 4
tapply function
tapply(array, indices, function, ..., simplify)
用途:
这个要复杂一点,是将指定function应用到根据指定indices归类的array元素上。输出结果根据function不同而不同。如果function返回值是一个数值的话,则结果是matrix;如果function返回多个数值的话,则结果是list。
例子:
> data2 <- as.data.frame(cbind(rnorm(16),rep(c(1,2,3,4),4),rep(c(1,2),each=8))) > colnames(data2) <- c("Result","VAR1","VAR2") > data2.avg1 <- tapply(data2$Result,data2$VAR1,mean) > data2.avg12 <- tapply(data2$Result,list(data2$VAR1,data2$VAR2),mean) > data2.avg1
1 2 3 4
0.6939699 -0.5911505 0.1732157 -0.3221063
> data2.avg12
1 2
1 0.7874465 0.6004933
2 0.1342668 -1.3165678
3 -0.1910606 0.5374919
4 -0.4412965 -0.2029161