R語言apply系列介紹

介於在網上看了不少,有些寫的不夠清楚,但願我下面能說清楚編程

1. apply

apply(data,margin,function安全

  • apply函數有3個參數:
    a. 第一個爲輸入的數據,要求爲矩陣或者數據框的形式
    b. 第二個參數指的是按行仍是按列來進行計算,爲1時是按行進行計算,爲2時是按列進行計算
    c. 第三個參數指的是使用什麼函數
  • 例子
mat <- matrix(c(1,2,3,4),nrow = 2)

> mat
     [,1] [,2]
[1,]    1    3
[2,]    2    4

#按行來求和
> apply(mat,1,sum)
[1] 4 6

#按列來求和
> apply(mat,2,sum)
[1] 3 7

2. lapply

lapply(x,function)app

  • lapply 有2個參數:

    a. 第一個參數是須要的數據,能夠是向量或者 列表 的形式 函數

    b. 第二個參數是函數code

    注:lapply 返回的是一個列表orm

  • 例子
> a <- c(1,2,3)
> lapply(a, rnorm)
[[1]]
[1] 0.2791608

[[2]]
[1] -0.07617067  1.39466313

[[3]]
[1]  0.16453412  1.57785198 -0.06192266

> lapply(a, function(x) x^2) 
[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9

3.sapply

sapply(x,function)io

sapplylapply實際上是同樣的,只是返回的結果是一個向量或者是一個矩陣,當沒法將一個結果簡化爲矩陣時,就會返回一個列表function

  • sapply 有2個參數:

    a. 第一個參數是須要的數據,通常向量,也可爲列表模板

    b. 第二個參數是函數map

    注:sapply 返回的是一個向量或矩陣

  • 例子
> sapply(1:10,function(x) x^2)
 [1]   1   4   9  16  25  36  49  64  81 100

> sapply(1:10,function(x) c(x,x^2))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    2    3    4    5    6    7    8    9    10
[2,]    1    4    9   16   25   36   49   64   81   100

#此時返回的結果是跟lapply函數是同樣的,這是由於沒法將一個結果簡化爲矩陣
> sapply(a, rnorm)
[[1]]
[1] 0.9481593

[[2]]
[1]  0.9141587 -1.2987320

[[3]]
[1]  0.4243788 -1.1125453 -1.0510732

4. vapply(sapply的安全版本)

能夠發現sapply函數很靈活,既能夠返回向量,又能夠返回矩陣,又能夠返回列表,但這種靈活有時候會有風險。vapply函數就是sapply函數的升級版本,vapply函數經過付加一個參數來設定每次返回值的模板。

vapply(x, function, FUN.VALUE)

  • 前面兩個參數與sapply徹底同樣,就多了第三個參數,就是累設定咱們返回值的模板的
  • 例子
> a <- list(c(1,2),c(2,3),c(1,3))
> sapply(a, function(x) x^2)
     [,1] [,2] [,3]
[1,]    1    4    1
[2,]    4    9    9

 #numeric(2)的意思是指定了模板numeric(2),意味着每次迭代都返回一個包含2個元素的數值向量
> vapply(a, function(x) x^2,numeric(2))   
     [,1] [,2] [,3]
[1,]    1    4    1
[2,]    4    9    9

#可是當list變成以下形式時,則會報錯,這是由於咱們設定了模型,當不能按照模板輸出時,函數就會返回錯誤信息
> b <- list(c(1,2),c(2,3),c(1,3,3))
> sapply(b, function(x) x^2)
[[1]]
[1] 1 4

[[2]]
[1] 4 9

[[3]]
[1] 1 9 9

> vapply(b, function(x) x^2,numeric(2))
Error in vapply(b, function(x) x^2, numeric(2)) : 
  values must be length 2,
 but FUN(X[[3]]) result is length 3

5. mapply (sapply的多元版本)

mapply能夠看作是sapply的多元版本,sapply只能在一個向來上迭代,而mapply能夠在多個向量上迭代。

mapply(function(x,y) x,y)

  • 例子
> mapply(function(a,b,c) a*b + b*c + a*c,
       a = c(1,2,3),
       b = c(5,6,7),
       c = c(-1,-2,-3)
       )
       
 [1] -1 -4 -9
 
 
> df <- data.frame(x = c(1,2,3),
+                  y = c(3,4,5))
> mapply(function(xi,yi) c(xi,yi,xi+yi),df$x,df$y)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    3    4    5
[3,]    4    6    8

6. Map(lapply的多元版本)

Maplapply的多元版本,故一般返回一個列表的形式

  • 例子
> df <- data.frame(x = c(1,2,3),
+                  y = c(3,4,5))
> Map(function(xi,yi) c(xi,yi,xi+yi),df$x,df$y)
[[1]]
[1] 1 3 4

[[2]]
[1] 2 4 6

[[3]]
[1] 3 5 8

參考資料: 任坤《R語言編程指南》

相關文章
相關標籤/搜索