R语言apply系列函数实例详解

来自:网络
时间:2023-05-18
阅读:
目录

前言

在R语言中,apply系列函数可以对向量、矩阵、数据框一次性对整体数据应用函数运算,非常方便

一、apply()函数

定义:apply()函数按矩阵的行或列方向应用指定函数。

apply(
  x # 数组或矩阵
  MARGIN #应用函数的方向,1行2列 
  FUN # 应用的函数
)
# 返回值根据数据Data的数据类型与Fun的返回值自动判断返回的数据类型

这里举个例子:

s <- matrix(1:9,ncol = 3)
apply(s,1,sum)
apply(s,2,sum)

即可得到下列结果:

apply(s,1,sum)
[1] 12 15 18
apply(s,2,sum)
[1]  6 15 24

在举一个R语言自带的鸢尾花数据集例子:

apply(iris[,1:4],2,sum)

结果如下:

apply(iris[,1:4],2,sum)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 

如果小伙伴们对鸢尾花数据集不了解可以输入iris查看。

于此同时R语言中还定义了rowSums(),rowMeans(),colSums(),colMeans()函数对行列进行求和、均值的函数。使用方式也很简单。

二、lapply()函数

定义:lapply()函数以列表的形式返回函数的结果

lapply(
  X #向量、列表、表达式、数据库
  FUN #应用的函数
  ... #额外参数,会被传递给fun函数
)

继续使用鸢尾花数据集举例:

lapply(iris[,1:4],mean)

结果如下:

lapply(iris[,1:4],mean)
$Sepal.Length
[1] 5.843333

$Sepal.Width
[1] 3.057333

$Petal.Length
[1] 3.758

$Petal.Width
[1] 1.199333

可以看到结果以列表的形式返回,可以使用unlist()函数将结果转换为向量。

unlist(
  #将列表转换为向量
  X #R对象
  recursive = FALSE #是否对x中的列表进行递归转换
  use.names = TRUE #是否保留列表中的值名称
)
unlist(lapply(iris[,1:4],mean))

结果如下所示:

unlist(lapply(iris[,1:4],mean))
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333

三、sapply()函数

sapply()函数与lapply()函数类似,其结果以矩阵、向量的数据类型返回。

定义:向列表,向量、表达式数据等应用指定函数,然后以向量或矩阵形式返回结果。

sapply(
  X #向量、列表、表达式、数据库
  FUN #应用的函数
  ... #额外参数,会被传递给fun函数
)

同样使用鸢尾花数据集作为例子:

sapply(iris[,1:4], sum)

结果如下:

sapply(iris[,1:4], sum)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 

当fun函数只有一个返回值,sapply()函数返回的就是包含这些值的向量。如果fun函数的结果时大于1的向量,则sapply()函数会返回矩阵。

如下例:

x <- sapply(iris[,1:4], function(x) {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->x >3})class(x)

结果如下:

class(x)
[1] "matrix"

数据如下图所示:

R语言apply系列函数实例详解

四、tapply()函数

定义:根据给定的标准,对向量中保存的数据进行分组,然后对各分组应用指定函数,并返回结果。

tapply(
  X #向量
  INDEX #数据分组索引
  FUN #应用的函数
  ... #额外参数
)

举个例子:

tapply(1:10,rep(1:2,5),sum)

结果如下图:

tapply(1:10,rep(1:2,5),sum)
 1  2 
25 30 

例中1:10表示的是数据1到10,rep(1:2,5)表示将1到2重复5次。1,3,5,7,9属于1分组,2,4,6,8,10属于2分组。对它们进行求和,得到上诉结果。

以鸢尾花数据集举例:

tapply(iris$Sepal.Length,iris$Species,sum)

结果如下所示:

tapply(iris$Sepal.Length,iris$Species,sum)
    setosa versicolor  virginica 
     250.3      296.8      329.4 

建立一个销售数据:

m <- matrix(1:8,ncol = 2,
            dimnames = list(c("春","夏","秋","冬"),
                            c("female","male")))

R语言apply系列函数实例详解

对该数据秋上下半年与性别分别秋销售之和。

代码如下:

tapply(m, list(c(1,1,2,2,1,1,2,2),
               c(1,1,1,1,2,2,2,2)), sum)

结果如下所示:

tapply(m, list(c(1,1,2,2,1,1,2,2),
+                c(1,1,1,1,2,2,2,2)), sum)
  1  2
1 3 11
2 7 15

这里是将各个数据的位置建立索引进行分组,而后进行求和。

五、mapply()函数

定义:以列表或向量形式给出的参数传递给指定函数,并返回函数执行结果。

mapply(
  FUN #应用的函数
  ... #待传递的参数
)

继续使用鸢尾花数据集举例(哈哈哈):

mapply(sum,iris[,1:4])

结果如下:

mapply(sum,iris[,1:4])
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 

总结

返回顶部
顶部