apply函数族

普通函数族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()函数参一为指定的函数,参二为指定函数的参数;根据某种正则表达式将一个字符向量的对应特征取出来.

你可能感兴趣的:(R,programing)