R语言学习——番外 apply系列函数的用法


本部分内容包括:

1、apply系列函数作用

2、apply函数家族成员及其各自功能(8个函数,共分4组)

3、具体用法

 

一、apply家族函数的作用,避免使用循环,R中循环的效率很低,非常耗时,使用apply家族函数可以避免循环

 

二、apply家族成员

 

 (一)进行分组计算——tapply()和apply()

1、tapply()函数:

(1)用途:对因子分组后的数据中每一组数据应用统一的函数进行计算,输出各组数据的批量计算结果。可以实现多因子分组的计算,但是只能处理一个变量,不能多变量同时处理。

(2)选项参数:

tapply(X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE)

x:输入选项,要求是具有split因子分组的数据对象,只支持单因子变量,即向量

INDEX:输入选项,可以是一个因子(向量)或一组因子(list列表),作为x对象中数据的分组依据,多个分组因子,如有2个因子,则以二维表格的矩阵形式输出结果,如有3个及以上,则以列表形式输出

FUN:用于设置所用的函数函数,即实际用于计算的公式,其参数值可以是已命名的函数,如sum(求和),mean(求均值),length(计数)等,也可以是匿名函数

匿名函数用法为:function(i) i+2*5

default:用于设置缺省值,其参数值可以设置为0或NA或其他数值

simplify:用于设置数据结果的表现形式,其参数值有TRUE和FALSE2种,T表示以简要形式输出结果,多以向量形式输出,F表示以复杂形式输出结果,多为多级列表。

 

(3)案例:统计全国水资源一级区不同水质类别湖泊的个数

输入变量:湖泊个数

分组因子:共2个,分别为水资源一级区和湖泊水质类别

①从剪切板读取输入数据

> data_t <- read.table("clipboard",header=T,sep="\t")

 输入后的数据如下:

 

 

 

②构建INDEX因子,本案例共2个因子,分别是水资源一级区和水质类别

> wrr1 <- factor(data_t$水资源一级区,levels=c("松花江区","辽河区","海河区","黄河区","淮河区","长江区","东南诸河区","珠江区","西南诸河区","西北诸河区"))

> wql <- factor(data_t$水质类别)

> wrr1
  [1] 松花江区   松花江区   松花江区   松花江区   松花江区   松花江区   松花江区   松花江区   辽河区    
 [10] 松花江区   松花江区   海河区     海河区     海河区     海河区     海河区     海河区     海河区    
 [19] 海河区     海河区     海河区     海河区     海河区     海河区     海河区     海河区     海河区    
 [28] 海河区     海河区     海河区     海河区     海河区     海河区     黄河区     西北诸河区 西北诸河区
 [37] 黄河区     西北诸河区 西北诸河区 西北诸河区 黄河区     西北诸河区 西北诸河区 黄河区     西北诸河区
 [46] 西北诸河区 黄河区     黄河区     西北诸河区 西北诸河区 西北诸河区 黄河区     黄河区     黄河区    
 [55] 西北诸河区 西北诸河区 黄河区     西北诸河区 西北诸河区 黄河区     西北诸河区 西北诸河区 黄河区    
 [64] 黄河区     黄河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区    
 [73] 淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区    
 [82] 淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区    
 [91] 淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     淮河区     东南诸河区 长江区    
[100] 长江区     长江区     长江区     长江区     东南诸河区 长江区     长江区     东南诸河区 东南诸河区
[109] 长江区     东南诸河区 长江区     东南诸河区 东南诸河区 长江区     东南诸河区 长江区     长江区    
[118] 长江区     长江区     长江区     长江区     东南诸河区 长江区     东南诸河区 长江区     长江区    
[127] 东南诸河区 长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区    
[136] 长江区     长江区     长江区     长江区     东南诸河区 长江区     长江区     长江区     长江区    
[145] 长江区     长江区     长江区     长江区     长江区     西北诸河区 长江区     长江区     西南诸河区
[154] 长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区    
[163] 长江区     长江区     长江区     西南诸河区 长江区     长江区     长江区     长江区     长江区    
[172] 长江区     长江区     长江区     长江区     西南诸河区 长江区     长江区     长江区     长江区    
[181] 长江区     西南诸河区 长江区     长江区     长江区     长江区     长江区     长江区     长江区    
[190] 长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区    
[199] 长江区     长江区     长江区     长江区     长江区     长江区     西北诸河区 长江区     长江区    
[208] 长江区     长江区     长江区     长江区     西南诸河区 长江区     长江区     西南诸河区 长江区    
[217] 长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区    
[226] 长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区    
[235] 长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区    
[244] 西南诸河区 长江区     长江区     长江区     长江区     长江区     长江区     长江区     长江区    
[253] 珠江区     珠江区     珠江区     珠江区     珠江区     珠江区     珠江区     珠江区     珠江区    
[262] 珠江区     珠江区     珠江区     珠江区     长江区     长江区     长江区     长江区     长江区    
[271] 长江区     长江区     长江区     长江区     长江区     西北诸河区
Levels: 松花江区 辽河区 海河区 黄河区 淮河区 长江区 东南诸河区 珠江区 西南诸河区 西北诸河区


> wql
  [1] Ⅴ   劣Ⅴ 劣Ⅴ 劣Ⅴ 劣Ⅴ 劣Ⅴ 劣Ⅴ Ⅴ   劣Ⅴ Ⅲ   Ⅱ   Ⅲ   Ⅴ   Ⅱ   Ⅲ   Ⅲ   Ⅳ   Ⅱ   Ⅱ   Ⅳ   Ⅳ   Ⅲ   劣Ⅴ Ⅱ   Ⅳ   Ⅳ  
 [27] Ⅳ   Ⅱ   Ⅱ   Ⅱ   Ⅲ   Ⅱ   Ⅲ   Ⅱ   劣Ⅴ 劣Ⅴ Ⅳ   Ⅲ   劣Ⅴ 劣Ⅴ Ⅲ   Ⅱ   劣Ⅴ Ⅱ   Ⅱ   Ⅱ   Ⅳ   劣Ⅴ 劣Ⅴ Ⅰ   Ⅱ   Ⅱ  
 [53] Ⅳ   劣Ⅴ Ⅱ   Ⅰ   Ⅳ   Ⅰ   Ⅲ   劣Ⅴ 劣Ⅴ 劣Ⅴ 劣Ⅴ Ⅳ   Ⅱ   Ⅴ   Ⅳ   Ⅲ   Ⅳ   Ⅳ   Ⅳ   Ⅳ   Ⅳ   Ⅳ   Ⅴ   Ⅳ   Ⅳ   Ⅳ  
 [79] Ⅳ   Ⅴ   Ⅲ   Ⅳ   Ⅳ   Ⅲ   Ⅳ   Ⅳ   Ⅴ   Ⅴ   Ⅳ   Ⅳ   劣Ⅴ Ⅳ   Ⅴ   Ⅴ   Ⅴ   劣Ⅴ Ⅳ   Ⅳ   Ⅴ   劣Ⅴ Ⅳ   Ⅴ   劣Ⅴ Ⅲ  
[105] Ⅳ   Ⅴ   Ⅴ   Ⅱ   Ⅳ   Ⅳ   Ⅴ   Ⅴ   Ⅲ   Ⅴ   Ⅱ   Ⅴ   Ⅴ   Ⅴ   Ⅴ   Ⅴ   劣Ⅴ Ⅲ   Ⅳ   Ⅱ   Ⅴ   Ⅲ   Ⅱ   劣Ⅴ Ⅳ   Ⅳ  
[131] Ⅳ   Ⅳ   Ⅳ   Ⅴ   Ⅴ   Ⅴ   Ⅴ   Ⅳ   劣Ⅴ Ⅲ   Ⅴ   Ⅴ   Ⅴ   Ⅴ   劣Ⅴ Ⅳ   Ⅳ   Ⅴ   Ⅴ   Ⅱ   Ⅲ   Ⅴ   Ⅳ   Ⅳ   Ⅲ   Ⅲ  
[157] Ⅳ   劣Ⅴ Ⅲ   Ⅴ   Ⅴ   劣Ⅴ Ⅲ   Ⅲ   Ⅴ   Ⅰ   Ⅳ   Ⅳ   劣Ⅴ Ⅴ   Ⅴ   Ⅱ   Ⅴ   Ⅴ   Ⅲ   Ⅲ   Ⅳ   Ⅳ   Ⅴ   Ⅲ   Ⅲ   Ⅰ  
[183] Ⅳ   Ⅳ   Ⅴ   Ⅴ   Ⅴ   Ⅳ   Ⅳ   Ⅴ   Ⅲ   Ⅳ   Ⅴ   Ⅴ   Ⅲ   Ⅰ   Ⅳ   Ⅲ   Ⅲ   劣Ⅴ Ⅴ   劣Ⅴ Ⅴ   Ⅳ   劣Ⅴ Ⅴ   劣Ⅴ Ⅴ  
[209] 劣Ⅴ Ⅳ   Ⅴ   劣Ⅴ Ⅳ   Ⅳ   Ⅱ   Ⅱ   Ⅴ   Ⅱ   Ⅱ   Ⅲ   劣Ⅴ Ⅴ   劣Ⅴ 劣Ⅴ Ⅳ   Ⅳ   Ⅱ   Ⅳ   Ⅳ   Ⅳ   Ⅲ   Ⅴ   劣Ⅴ Ⅴ  
[235] Ⅲ   Ⅴ   Ⅲ   Ⅲ   Ⅴ   Ⅳ   Ⅴ   Ⅴ   Ⅲ   劣Ⅴ Ⅲ   劣Ⅴ Ⅲ   Ⅳ   Ⅴ   Ⅴ   Ⅳ   Ⅳ   Ⅴ   Ⅱ   Ⅱ   劣Ⅴ Ⅱ   劣Ⅴ Ⅳ   Ⅲ  
[261] Ⅱ   劣Ⅴ Ⅳ   劣Ⅴ Ⅳ   Ⅴ   劣Ⅴ Ⅲ   劣Ⅴ Ⅳ   劣Ⅴ 劣Ⅴ Ⅴ   Ⅲ   Ⅴ   劣Ⅴ
Levels: Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ 劣Ⅴ

  

③采用tapply()函数进行统计,统计的函数选择“length”计数函数,将缺失值设置为0

> result <- tapply(data$湖泊名称,list(wrr1,wql),FUN=length,default=0)
> result
           Ⅰ Ⅱ  Ⅲ  Ⅳ  Ⅴ 劣Ⅴ
松花江区   0 1  1  0  2   6
辽河区     0 0  0  0  0   1
海河区     0 8  6  6  1   1
黄河区     0 4  1  5  0   4
淮河区     0 0  3 19  8   2
长江区     1 5 24 38 54  22
东南诸河区 0 4  4  2  2   0
珠江区     0 4  1  3  1   4
西南诸河区 2 1  1  1  0   2
西北诸河区 3 6  2  0  0  10

④计算求和项,得到最终结果表 

> result <- cbind("合计"=rowSums(result),result)
> result
           合计 Ⅰ Ⅱ  Ⅲ  Ⅳ  Ⅴ 劣Ⅴ
松花江区     10 0 1  1  0  2   6
辽河区        1 0 0  0  0  0   1
海河区       22 0 8  6  6  1   1
黄河区       14 0 4  1  5  0   4
淮河区       32 0 0  3 19  8   2
长江区      144 1 5 24 38 54  22
东南诸河区   12 0 4  4  2  2   0
珠江区       13 0 4  1  3  1   4
西南诸河区    7 2 1  1  1  0   2
西北诸河区   21 3 6  2  0  0  10
> result <- rbind(result,"全国"=colSums(result))
> result
           合计 Ⅰ  Ⅱ  Ⅲ  Ⅳ  Ⅴ 劣Ⅴ
松花江区     10 0  1  1  0  2   6
辽河区        1 0  0  0  0  0   1
海河区       22 0  8  6  6  1   1
黄河区       14 0  4  1  5  0   4
淮河区       32 0  0  3 19  8   2
长江区      144 1  5 24 38 54  22
东南诸河区   12 0  4  4  2  2   0
珠江区       13 0  4  1  3  1   4
西南诸河区    7 2  1  1  1  0   2
西北诸河区   21 3  6  2  0  0  10
全国        276 6 33 43 74 68  52

  

2、apply()函数:

(1)用途:对矩阵的不同维度进行批量计算处理。

(2)选项参数:

 apply(X, MARGIN, FUN, ..., simplify = TRUE)

 X:输入选项,数据类型为矩阵(matrix)或数组(array)

MARGIN:输入选项,对象X的维度,可取参数值为1,2,3等数字

FUN:所用函数,可取参数值为已命名函数和匿名函数

simplify:跟tapply一致,决定输出格式复杂与否的选项 

(3)举例

> x <- cbind(x1 = 3, x2 = c(4:1, 2:5))
> dimnames(x)[[1]] <- letters[1:8]
> x
  x1 x2
a  3  4
b  3  3
c  3  2
d  3  1
e  3  2
f  3  3
g  3  4
h  3  5

> col.sums <- apply(x, 2, sum)
> col.sums
x1 x2 
24 24 

> row.sums <- apply(x, 1, sum)
> row.sums
a b c d e f g h 
7 6 5 4 5 6 7 8 

 

(二)lapply()系列函数——Apply a Function over a List or Vector(包括lapply、sapply、vapply、rapply)

(1)用途,将函数作用于一个列表或向量,起到循环迭代的作用

(2)选项参数

lapply(X, FUN, ...)

  

X:输入选项,列表或向量

FUN:函数

…:函数的其他参数

(3)举例

想对数据data中的湖泊总面积和营养评分值2个变量进行求和计算

> lapply(list(data$湖泊总面积,data$评分值),sum,na.rm=T)
[[1]]
[1] 39792.29

[[2]]
[1] 14284.51

  

当对象X不是函数FUN的第一参数时,最好使用匿名函数,增强易读性

> lapply(list(4,5,6),function(x) rnorm(3,x,0.1))
[[1]]
[1] 4.053170 4.182545 4.057495

[[2]]
[1] 5.127469 5.119175 4.962460

[[3]]
[1] 5.995226 6.065272 5.890950

  以上代码创建了均值分别为4、5、6,标准差=0.1的3组随机数字,每组数字的个数为3

 2、sapply、vapply、rapply

(1)sapply:lapply的简化版,选项参数与lapply基本一致,输出的结果是简化形式的,不是列表,多趋向于向量和矩阵

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
sapply(list(4,5,6),function(x) rnorm(3,x,0.1))
         [,1]     [,2]     [,3]
[1,] 4.114730 5.005572 6.111872
[2,] 3.916513 5.088405 5.869742
[3,] 3.925176 5.034011 5.859441

(2)vapply:sapply的可选参数版,增加了一个选项FUN.VALUE

vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

FUN.VALUE:  

(3)rapply:lapply的递归版,可以对列表中的每一个子列表中的每一个元素循环遍历,应用函数  

 

 (三)多参数计算——mapply()和map()系列函数

1、用途:对多个变量同时使用函数进行计算——Apply a Function to Multiple List or Vector Arguments

2、选项参数

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)

  

 

 

> mapply(length,data)
水资源一级区 水资源二级区 水资源三级区   省级行政区   地级行政区   县级行政区     湖泊名称   湖泊总面积 
         276          276          276          276          276          276          276          276 
    全年类别     汛期类别   非汛期类别       评分值   营养化程度 
         276          276          276          276          276 

  

 (四)环境变量eapply()

 eapply (env, FUN, ..., all.names = FALSE, USE.NAMES = TRUE) 

env:环境空间

FUN:选用的函数,可以是自定义函数,也可以是已命名函数

all.names:匹配的类型,参数值为TRUE或FALSE,为TRUE时表示将函数应用于所有值

USE.NAMES:设置返回的列表中是否有名称


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM