Day 14- vapply 及tapply
(前言:內個,我只是個剛接觸程式設計的小萌新,如果內文寫的不對,還請各位大大指教 Orz)
今天雖然是颱風天,但還是要堅持下去ㄛ ˊ vˋ
(啊對了,這邊重新附上新的kirbsaesthetics資料框資料,因為在亂寫程式碼時不小心把昨天的kirbsaesthetics覆蓋掉了 QnQ 圖片可能會糊得像稀飯一樣,還請多多見諒 ˊˋ)
昨天學了apply家族中的lapply
和sapply
函數,兩者都以列表做輸入,把一個函數重複對每個列表中的元素執行,然後結合並回傳結果,lapply
回傳一個列表,而sapply
會試圖對lapply
的結果進行簡化。
至於今天,我會把重點放在vapply
及tapply
身上。
vapply
跟sapply
很像,兩者的差異僅在於函數的寫法以及兩個函數回傳資料的性質。前面提到,sapply
會自動根據lapply
輸出的資料結果進行整理,然後以最佳資料型態呈現。但是sapply
的輸出結果往往需要我們回去重複確認,才有辦法確保接下來的程式設定不會出問題。聽起來超級麻煩的,而且不確認的話很容易出錯。因此,再不確定sapply
的資料輸出型態時,可以使用vapply
來指定。
vapply
的函數寫法為:vapply(變數, 函數, 回傳資料性質(回傳資料長度))
,可以看到vapply
的引數多了一個回傳資料性質,這樣使用者可以透過指定資料的輸出型態,降低誤判的機率。(不小心指定錯資料型態也沒有關係,因為vapply會告訴妳妳是否輸錯資料型態)
就昨天的kirbsaesthetics而言,如果要用sapply
來加總每一個欄的數值的話,就是寫sapply(kirbsaesthetics, sum)
,但是,如果使用vapply
,可以有好幾種寫法,以下舉幾個例子:
vapply(kirbsaesthetics, sum, matrix(18)) #第一種寫法
vapply(kirbsaesthetics, sum, vector(mode = "numeric", length = 1)) #第二種寫法
vapply(kirbsaesthetics, sum, numeric(1)) #第三種寫法
以上程式都會輸出同樣的結果:
(同樣的東西可能還有好幾種寫法,但是我目前試出來的就這些)
以上這些都會回傳一樣的結果,但是,透過直接指定輸出資料型態(matrix, 向量或數值)可以確保未來在處理其他牽涉資料型態的程式時不會出錯。
接下來學的是tapply
函數,但是在正式介紹tapply
函數之前,要先認識一下table
函數。table
函數的功能是列出在一個列表裡同一元素出現的次數,寫法為table(列表變數名稱$列表欄位名稱)
,例如:table(kirbsaesthetics$col.9)
,輸出結果是:
那現在正式進入tapply
函數的介紹,tapply
函數寫法是:tapply(列表變數名稱$列表欄位名稱, 列表變數名稱$列表欄位名稱, 函數)
。tapply
函數會先統計第二個指定列表欄位的重複元素,然後根據重複元素值的範圍內進行對應欄位的函數運算(我想不到更好的方式解釋這東西了,誰來救救我的中文 QAQ)。例:tapply(kirbsaesthetics$col.1, kirbsaesthetics$col.9, sum)
,這個函數會回傳以下結果:
可以看到,這個函數把col.9重複的元素(1,2,3,4)都整理起來,然後計算1,2,3,4對應col.1內的總和值,這樣一來,如果要做資料的統計的話很方便。不過,寫函數的同時,也別忘記指定列表欄位的先後順序,才不會輸出錯的資料喔。
明天把剩下的apply家族函數學完吧