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