iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

新手 R 語言學習紀錄系列 第 13

Day 13- R語言 apply家族函數、apply、lapply、 sapply

  • 分享至 

  • xImage
  •  

Day 13- apply 家族函數
(前言:由於本人沒有接觸過程式語言及程式設計,寫的內容可能不是很正確,還請大家多多指教 :D)

今天要看的是R在數據處理方面最核心的函數:apply家族函數,這個函數家族有很多人(啊不是,應該是很多種),大致上比較常用到的有8種,分別是:apply, lapply, sapply, vapply, tapply, mapply, rapply, eapply。

在正式進入apply函數之前,我們先建立一個資料框,我用的程式碼如下:

col.1 <- c(rnorm(100))
col.2 <- c(rnorm(100))
col.3 <- c(rnorm(100))
col.4 <- c(rnorm(100))
col.5 <- c(rnorm(100))
col.6 <- c(rnorm(100))
col.7 <- c(rnorm(100))
col.9 <- c(rep(1, 10),rep(2,40), rep(3, 30), rep(4, 20))
kirbsaesthetics <- data.frame(col.1, col.2, col.3, col.4, col.5, col.6, col.7, col.8,col.9)

kirbsaesthetics 總共有9個欄,100個列

kirbsaesthetics這個資料框實在太大,要處理資料的話會很麻煩,對吧。但是apply家族函數就是設計來運算或修改大量資料的,所以,如果能夠學會使用apply家族函數的話,對資料分析會很有用,甚至可以不用寫for迴圈了

那我們正式進入apply家族函數吧。
apply函數的寫法是apply(變數名稱, 1或2(決定計算的是欄還是列),函數),如果要將函數的功能以欄為單位計算的話,就輸入1,如果要以列為單位計算的話,就輸入2,執行結果如下圖表示:
https://ithelp.ithome.com.tw/upload/images/20190929/20120887Oa88Ho7xFS.png

但是,我不想要每次都要寫那麼長的函數,還要冒著可能搞混1跟2的風險(被揍),因此,我們可以用一個叫lapply(list apply)的函數簡化原本要寫的函數,這個函數會把data frame當作一個列表來執行函數(畢竟資料框就是一個有多個列的列表,可以用is.list函數檢驗)。lapply的寫法是lapply(data frame, 函數),執行結果會以列表方式計算回傳,範例:
https://ithelp.ithome.com.tw/upload/images/20190929/20120887WQomonCd7D.png

Sapply(simplify apply)則是lapply的延伸版本,Sapply會在背地裡呼叫lapply,然後主動想要幫忙「簡化」計算結果。簡單來說,如果函數執行結果是一個列表,每個列表值長度為1,sapply會回傳一個向量,如果函數執行結果是一個列表,每個列表的值是同樣長度的向量且長度大於1,sapply會回傳一個矩陣, 否則sapply會回傳一個列表。
這邊我們用lapplysapply比對回傳的結果,用的函數是sum,比對結果如下:
https://ithelp.ithome.com.tw/upload/images/20190929/20120887ZkXlQ17LqF.png
https://ithelp.ithome.com.tw/upload/images/20190929/20120887rX2axmoRle.png
sapplylapply的資料簡化了,變成一個數值向量

其實,apply家族函數的應用實在很多,可以組合不同函數、變數來計算不同種資料,我這邊也只有做最基礎的應用跟探討一下兩個函數不同的性質。

明天繼續寫apply家族的其他函數吧

參考資料:

  1. http://blog.fens.me/r-apply/

上一篇
Day 12- R語言 自定義函數
下一篇
Day 14- R語言 vapply、tapply
系列文
新手 R 語言學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言