本節書摘來自華章社群《r語言機器學習:實用案例分析》一書中的第1章,第1.5節進階結構,作者[印度] 拉格哈夫·巴利(raghav bali)迪潘簡·撒卡爾(dipanjan sarkar),更多章節内容可以通路雲栖社群“華章社群”公衆号檢視
1.5 進階結構
當我們讨論不使用循環來操作向量時,我們前面提到向量化這個術語。雖然循環是遍
曆向量并進行計算的一個好方法,但是在處理現大資料時它并不是非常有效。這時,r 提
供了下面介紹的一些進階結構。我們将介紹以下函數:
j lapply :對清單進行循環,并對清單的每個元素進行函數求值。
j sapply : lapply 的簡化版本。
j apply :對數組的邊界進行函數求值。
j tapply :對一個向量的子集進行函數求值。
j mapply : lapply 的多元版本。
1.5.1 lapply 和 sapply 函數
正如我們之前提到的, lapply 将一個清單和一個函數作為輸入,對清單中的每一個元
素進行函數求值。如果輸入不是清單,它将在傳回輸出前應用函數 as.list 将輸入參數轉
換成清單類型。因為實際循環在内部使用 c 語言代碼來實作,是以 lapply 比普通的循環運
行得更快。
在下面的代碼片段中,我們将看到 lapply 的實作和一個案例:
輸出:

提到 sapply ,除了它嘗試盡可能地簡化輸出結果之外,它與 lapply 十分相似。例如,
如果最終結果的每個元素的長度都為 1,那麼 sapply 将傳回一個向量;如果最終結果的每
個元素的長度都相同但大于 1,那麼它将傳回一個矩陣;如果不能簡化結果,那麼我們将得
到與 lapply 一樣的結果。我們用下面的例子進行說明:
1.5.2 apply 函數
apply 函數用于對數組的邊界進行函數求值。例如,對一個數組的行或列應用聚集函數
(aggregate function)。函數 rowsums 、 rowmeans 、 colsums 和 colmeans 在其内部也使用 apply
函數,但進行了進一步的優化,在處理大數組時十分有用。在下面的例子中我們将看到以
上函數的使用:
是以,你可以看到,完全不使用循環而對矩陣應用各種統計函數是如此簡單。
1.5.3 tapply 函數
tapply 函數可以用來對一個向量的子集進行函數求值。如果你熟悉關系資料庫,這與應用 sql 中的 group by 語句類似。我們将利用以下的案例進行說明:
1.5.4 mapply 函數
mapply 函數是 lapply 函數的多元版本,它用于對參數集合進行并行的函數求值。舉一
個簡單的例子,當我們使用 rep 函數建立一個向量清單時,我們必須寫多個 rep 。然而,使
用 mapply 函數我們可以通過一種更簡練的方式獲得同樣的結果,如下所示:
1.6 進一步使用 r
在我們進行機器學習之前,有必要停頓一下,深呼吸,回顧我們之前學習的内容。這
樣快速而又仔細地回顧 r 會給你之後章節的學習帶來很大幫助。然而,還有兩件事我們必
須馬上完成。它們是如何在 r 中獲得幫助以及如何操作 r 中的不同添加包。
1.6.1 獲得幫助
現在,你必須已經了解了在 r 中有數千個函數和結構,你不可能也不必要了解它們中
的每一個有哪些功能。r 提供了許多直覺的方式來獲得就關于函數、添加包或資料結構的幫
助。你可以通過在 r 的指令提示符運作函數 help.start() ,它将打開一個手冊浏覽器。這
裡,你将獲得包括關于 r 的手冊、參考文檔和其他材料的詳細資訊。下面的指令顯示了在
運作指令 help.start() 後螢幕截圖中的内容,你可以使用它進一步浏覽并獲得更多的幫助: