R语言--apply家族

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!

 
Valar morghulis
原文地址:https://www.cnblogs.com/super-yb/p/11049660.html