普通函数族apply函数族汇总:
tapply(X,INDEX,FUN=NULL,…,simplify=TRUE)
apply(X,MARGIN,FUN)
lapply(X,FUN)
sapply(X,FUN,…,simplify=TRUE,USE.NAMES=TRUE)
mapply(FUN,…,MoreArgs=NULL,simplify=TRUE,USE.NAMES=TRUE)
1、根据不同的函数,输入数据可能是向量、数组、矩阵或数据框;
INDEX一般为类别变量;
MARGIN指定矩阵的维度,1表示矩阵的行,2表示矩阵的列;
FUN为参与运算的函数,可以是R自带的函数也可以是自己编写的函数;
….为FUN指定的参数,紧跟在函数的后面
2、各个函数的应用情况(按照常用优先):
apply()函数计算涉及到矩阵的每一行或列,也就是适合数据具备数组的特性,结果通常返回一个向量或数组,但根据行或列操作的结果维度不同,将返回一个列表;
lapply()和sapply()都是对列表进行操作的函数,若输入的是向量,会将向量强制转化为列表;
不同的是它们的返回结果类型:lapply()结果也返回一个列表;sapply()函数可将输出结果简化为向量或者矩阵。有时可以结合split函数将需要处理的数据创建为一个列表,然后再使用这两个函数。
tapply()函数计算涉及到一个单一的向量,返回一个数组,其维数与分组向量的维数相同;
mapply()函数所要计算函数的参数为一个矩阵或数组,其返回的结果一般是列表形式
例如
1.分析iris数据集中Sepal.Length在各个花种中的最大值。这里的Sepal.Length和Species为两个向量,且各自的长度均相等.
max_Sepal.Length <- tapply(iris$Sepal.Length,iris$Species,max)
#参数iris$Species相当于向量分组计算的依据
max_Sepal.Length
setosa versicolor virginica
5.8 7.0 7.9
2.如果想对某个变量(向量)进行多变量的分组分析(有多个分组依据)时,也可以采用tapply函数
#首先构造一个数据框
set.seed(122)
x <- rpois(100,2)
y <- rpois(100,4)
z <- rt(100,2,3)
data <- data.frame(x=x,y=y,z=z)
head(data)
##对z变量做分组统计,分组变量为x,y
tapply(data$z,INDEX=list(data$x,data$y),FUN=sum)
结果中NA表示x和y的分组中没有对应的z值
3.当数据具备数组的特性,可通过apply函数对数据的每个维度进行运算,例如标准化一个矩阵
apply函数隐士循环对矩阵各列作标准化
mat <- matrix(1:12,ncol=3)
apply(mat,MARGIN=2,FUN=scale)
[,1] [,2] [,3]
[1,] -1.1618950 -1.1618950 -1.1618950
[2,] -0.3872983 -0.3872983 -0.3872983
[3,] 0.3872983 0.3872983 0.3872983
[4,] 1.1618950 1.1618950 1.1618950
scale(mat)
[,1] [,2] [,3]
[1,] -1.1618950 -1.1618950 -1.1618950
[2,] -0.3872983 -0.3872983 -0.3872983
[3,] 0.3872983 0.3872983 0.3872983
[4,] 1.1618950 1.1618950 1.1618950
attr(,"scaled:center")
[1] 2.5 6.5 10.5
attr(,"scaled:scale")
[1] 1.290994 1.290994 1.290994
lapply()函数和sapply()函数把一个列表或向量作为其第一个参数,再把需要应用到每个列表元素的函数作为它的第二个参数
查看字符向量中每一个元素所包含的单词个数:
x <- c("Today is Sunday",
"The weather is very nice",
"please check your R language synax",
"R is a useful tool"
)
#strsplit根据每个分隔符将字符串分割为多个单词
split_x <- strsplit(x," ")#分隔符是空格
mem_length1 <- lapply(split_x,length)
#unlist将一个列表结构简化成一个包含原始部件的向量
unlist(mem_length1)
mem_length2 <- sapply(split_x,length)
unlist(mem_length2)
sapply()函数的另一个重要问题涉及到数据框,当数据框被视为列表时,数据框的每一列看成独立的列表元素;查看数据集iris和ChickWeight各个字段的模式和类
sapply(iris,class)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
sapply(ChickWeight,class)
$weight
[1] "numeric"
$Time
[1] "numeric"
$Chick
[1] "ordered" "factor"
$Diet
[1] "factor"
mapply()函数参一为指定的函数,参二为指定函数的参数;根据某种正则表达式将一个字符向量的对应特征取出来.