R语言为脚本语言,运算速度较慢,使用for循环等控制流会导致整个运算更慢 为此,R官方推出了apply家族,意在提供快速强大的循环操作。 apply经常配合R函数或自定义函数使用 #apply(matrix/array,1/2/3,fun) #第一个参数需为矩阵或数组 #第二个参数1表示按行,2表示按列,3表示按数组中的表格 #第三个参数表示执行的函数 #计算行合计、列合计、合计 x <- cbind(x1 = 3, x2 = c(4:1, 2:5));x dimnames(x)[[1]] <- letters[1:8];x apply(x, 2, mean, trim = .2) col.sums <- apply(x, 2, sum) row.sums <- apply(x, 1, sum) rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums))) lapply表示list apply,无第二个参数,第三个参数同apply 其他sapply、vapply、mapply、tapply用的很少,各取所取吧 关于sapply的应用: mystats <- function(x,na.omit=FALSE){ #一个函数返回x的多个描述性统计量 if (na.omit) x <- x[!is.na(x)] m <- mean(x) n <- length(x) s <- sd(x) return(c(n=n,mean=m,stdev=s)) } dstats <- function(x)sapply(x, mystats) #将mystats(自定义函数)应用到x的每一列 dstats <- function(x)apply(x, 2, mystats) #apply加第二个参数,表示函数执行在列 dstats <- function(x)lapply(x, mystats) #lapply,输出为一个list,结果不 好 看 by(mtcars[1,4,7],mtcars$am,dstats) #第二个参数定义分组,am列只有1,2 #data$ 和 data[,2]数据均为横向显示,而data[2]则为纵向,次数sapply需要纵向数据 aggregate(cholesterol$response,by=list(cholesterol$trt),FUN=mean) #方差分析时,数据类型为纵向,第一列为组别号,第二列为响应变量,同时求不同组下的均数 完成一个任务,同时批量输出R data按照某列值分组下 指定列 的若干统计量(funciton),get!