使用匿名函式和 apply
apply
用於評估陣列或矩陣邊緣的函式(可能是匿名函式)。
讓我們使用 iris
資料集來說明這個想法。iris
資料集測量了來自 3 個物種的 150 朵花。讓我們看看這個資料集的結構:
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
現在,假設你想知道每個變數的平均值。解決這個問題的一種方法可能是使用 for
迴圈,但 R 程式設計師通常更喜歡使用 apply
(原因,請參閱備註):
> apply(iris[1:4], 2, mean)
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.843333 3.057333 3.758000 1.199333
- 在第一個引數中,我們將
iris
子集僅包含前 4 列,因為mean
僅適用於數字資料。 2
的第二個引數值表示我們只想處理列(r×c 陣列的第二個下標);1
會給出行的意思。
以同樣的方式,我們可以計算更有意義的值:
# standard deviation
apply(iris[1:4], 2, sd)
# variance
apply(iris[1:4], 2, var)
警告 :R 有一些內建函式,更適合計算列和行和,意思是: colMeans
和 rowMeans
。
現在,讓我們做一個不同的,更有意義的任務:讓我們只計算那些大於 0.5
的值的平均值。為此,我們將建立自己的 mean
功能。
> our.mean.function <- function(x) { mean(x[x > 0.5]) }
> apply(iris[1:4], 2, our.mean.function)
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.843333 3.057333 3.758000 1.665347
(注意 Petal.Width
的平均值差異)
但是,如果我們不想在其餘程式碼中使用此函式,該怎麼辦?然後,我們可以使用匿名函式,並像這樣編寫我們的程式碼:
apply(iris[1:4], 2, function(x) { mean(x[x > 0.5]) })
因此,正如我們所看到的,我們可以使用 apply
僅使用一行對資料集的列或行執行相同的操作。
警告 :由於 apply
根據指定函式的結果長度返回非常不同型別的輸出,因此在你不以互動方式工作的情況下,它可能不是最佳選擇。其他一些*apply
系列函式更具可預測性(參見備註)。