筆記:R語言 Apply Functions用法

  1. apply()
    apply(X, MARGIN, FUN)
    X: 矩陣或資料
    MARGIN: 1,對行應用;2,對列應用;both,對行列應用
    FUN: 函數
M <- matrix(1, ncol=2, nrow = 3)
M # 2x3 矩陣 
##      [,1] [,2]
## [1,]    1    1
## [2,]    1    1
## [3,]    1    1
f1 <- function(x) {
         x + c(2,3)
 }
apply(M,1,f1) #  2x3 矩陣
##      [,1] [,2] [,3]
## [1,]    3    3    3
## [2,]    4    4    4
f2 <- function(x) {
         x + c(2,3,4)
 }
apply(M,2,f2)  # 3x2 矩陣
##      [,1] [,2]
## [1,]    3    3
## [2,]    4    4
## [3,]    5    5
  1. lapply()
    lapply(X, FUN)
    X: 列表或矩陣
    FUN: 函數
    輸出:列表
#資料是向量
continents <- c("AFRICA","ANTARCTICA","ASIA","EUROPE","NORTH AMERICA","OCEANIA","SOUTH AMERICA")
#nchar 用來計charactor數量 空格也算
lapply(X = continents, FUN = nchar)  
## [[1]]
## [1] 6
## 
## [[2]]
## [1] 10
## 
## [[3]]
## [1] 4
## 
## [[4]]
## [1] 6
## 
## [[5]]
## [1] 13
## 
## [[6]]
## [1] 7
## 
## [[7]]
## [1] 13
#解除列表,呈現向量
unlist(lapply(X = continents, FUN = nchar))
## [1]  6 10  4  6 13  7 13
#資料是列表
x <- list(a = 1:6, 
          b = c(3, 5, 7), 
          c = c(15:7), 
          d = c(100, 200)
)
lapply(x,mean)
## $a
## [1] 3.5
## 
## $b
## [1] 5
## 
## $c
## [1] 11
## 
## $d
## [1] 150
#資料是列表矩陣
ml <- list(a = matrix(1,2,2), b = matrix(1:9,3,3))
ml
## $a
##      [,1] [,2]
## [1,]    1    1
## [2,]    1    1
## 
## $b
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
lapply(ml,mean)
## $a
## [1] 1
## 
## $b
## [1] 5
  1. sapply()
    sapply(X, FUN, …, simplify = TRUE, USE.NAMES = TRUE)

X: 列表或矩陣
FUN: 函數
輸出:向量、矩陣、列表

簡化版的lapply()

#矩陣
ms <- list(a = matrix(1,2,2), b = matrix(1:9,3,3),beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
ms
## $a
##      [,1] [,2]
## [1,]    1    1
## [2,]    1    1
## 
## $b
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
## 
## $beta
## [1]  0.04978707  0.13533528  0.36787944  1.00000000  2.71828183  7.38905610
## [7] 20.08553692
## 
## $logic
## [1]  TRUE FALSE FALSE  TRUE
sapply(ms,mean,USE.NAMES = TRUE)
##        a        b     beta    logic 
## 1.000000 5.000000 4.535125 0.500000
  1. vapply()
    vapply(X, FUN, FUN.VALUE, …, USE.NAMES = TRUE)
    X: 列表或矩陣
    FUN: 函數
    輸出:向量、矩陣、列表

與sapply() 相似,可預先指定的返回值類型。

mv <- list(a = matrix(1,2,2), b = matrix(1:9,3,3),beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))

vapply(mv, quantile, FUN.VALUE = c(0,0,0,0,0), USE.NAMES = F)
##      [,1] [,2]        [,3] [,4]
## [1,]    1    1  0.04978707  0.0
## [2,]    1    3  0.25160736  0.0
## [3,]    1    5  1.00000000  0.5
## [4,]    1    7  5.05366896  1.0
## [5,]    1    9 20.08553692  1.0
#可創造函數
funv <- function(x) {return(c(min = min(x), max = max(x)))}

vapply(mv, funv, c(min = 0, max = 0), USE.NAMES = T)
##     a b        beta logic
## min 1 1  0.04978707     0
## max 1 9 20.08553692     1
  1. tapply()
    tapply(X, INDEX, FUN = NULL)
    X: 向量
    FUN: 函數
#創造向量
a <- c(1, 2, 3, 10, 20, 30, 100, 200, 300)
#創造群組
b <- c("a", "a", "a", "b", "b", "b", "c", "c", "c")
tapply(a, b, mean)
##   a   b   c 
##   2  20 200
  1. mapply()
    mapply(FUN, …, MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)
    多變量版的sapply FUN: 函數
    X: 向量
mapply(sum, 1:5, 1:5, 1:5)
## [1]  3  6  9 12 15
values1 <- list(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9))
values2 <- list(a = c(10, 11, 12), b = c(13, 14, 15), c = c(16, 17, 18)) 

mapply(function(num1, num2) max(c(num1, num2)), values1, values2)
##  a  b  c 
## 12 15 18
mapply(sum, values1)
##  a  b  c 
##  6 15 24
mapply(sum, values2)
##  a  b  c 
## 33 42 51
mapply(sum, values1,values2)
##  a  b  c 
## 39 57 75
  1. rapply() rapply(X, f, classes = “ANY”, deflt = NULL, how = c(“unlist”, “replace”, “list”), …)
    使每個列表結構的元素應用函數(重複) X: 列表
    FUN: 函數
#創一個列表
lr <- list(a = list("Toy", "Woody", "Buzz"), b = c(1, 100), c = list(TRUE))
#創一個函數
funr <- function(x) {
    if (is.character(x)) { #如果元素是character 加上
        return(paste0(x, "!!!"))
    }else if(is.numeric(x)){
        return(x + 100) #如果元素是numeric, 加100
    }else{#如果元素都不是以上的,直接顯示
      return(x)
    }
}

rapply(lr, funr)
##         a1         a2         a3         b1         b2          c 
##   "Toy!!!" "Woody!!!"  "Buzz!!!"      "101"      "200"     "TRUE"
sapply(lr,funr,USE.NAMES = TRUE)
## $a
## $a[[1]]
## [1] "Toy"
## 
## $a[[2]]
## [1] "Woody"
## 
## $a[[3]]
## [1] "Buzz"
## 
## 
## $b
## [1] 101 200
## 
## $c
## $c[[1]]
## [1] TRUE