R Language Utilizzare le funzioni anonime con apply


Esempio

apply è usato per valutare una funzione (forse anonima) oltre i margini di un array o di una matrice.

Usiamo il set di dati iris per illustrare questa idea. Il set di dati iris ha misurazioni di 150 fiori di 3 specie. Vediamo come questo set di dati è strutturato:

> 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

Ora, immagina di voler conoscere la media di ciascuna di queste variabili. Un modo per risolvere questo potrebbe essere l'uso di un ciclo for , ma i programmatori R preferiranno spesso utilizzare apply (per i motivi per cui, vedi Note):

> apply(iris[1:4], 2, mean)

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333
  • Nel primo parametro, suddividiamo il iris per includere solo le prime 4 colonne, poiché la mean funziona solo su dati numerici.
  • Il secondo valore del parametro 2 indica che vogliamo lavorare solo sulle colonne (il secondo indice dell'array r × c); 1 darebbe i mezzi di riga.

Allo stesso modo possiamo calcolare valori più significativi:

# standard deviation
apply(iris[1:4], 2, sd)
# variance
apply(iris[1:4], 2, var)

Avvertenza : R ha alcune funzioni integrate che sono migliori per il calcolo delle somme di colonne e righe e significa: colMeans e rowMeans .

Ora, facciamo un compito diverso e più significativo: calcoliamo la media solo per quei valori che sono più grandi di 0.5 . Per questo, creeremo la nostra funzione 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

(Nota la differenza nella media di Petal.Width )

Ma cosa succede se non vogliamo usare questa funzione nel resto del nostro codice? Quindi, possiamo usare una funzione anonima e scrivere il nostro codice in questo modo:

apply(iris[1:4], 2, function(x) { mean(x[x > 0.5]) })

Quindi, come abbiamo visto, possiamo usare apply per eseguire la stessa operazione su colonne o righe di un set di dati usando solo una riga.

Avvertenza : poiché apply restituisce tipi di output molto diversi a seconda della lunghezza dei risultati della funzione specificata, potrebbe non essere la scelta migliore nei casi in cui non si lavori in modo interattivo. Alcuni degli altri *apply funzioni familiari sono un po 'più prevedibili (vedere Note).