使用匿名函式和 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 有一些內建函式,更適合計算列和行和,意思是: colMeansrowMeans

現在,讓我們做一個不同的,更有意義的任務:讓我們計算那些大於 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 系列函式更具可預測性(參見備註)。