I cicli con lapply e sapply
lapply()
e sapply()
applicano iterativamente una funzione a tutti gli elementi di un oggetto (vettore, o lista di vettori, matrice, ecc.), restituendo come risultato una lista (lapply
) o un oggetto “semplificato”, ovvero trasformato dove possibile in array (vettore o matrice: sapply
).
Vedi anche:
lapply
La sintassi di lapply()
prevede di indicare l'oggetto, poi la funzione da applicare a tutti gli elementi dell'oggetto, ed eventualmente gli argomenti della funzione:
lapply(X, FUN, ...)
Ad esempio, scrivendo:
lapply(mtcars, mean)
otterremo una lista con i risultati:
$mpg [1] 20.09062 $cyl [1] 6.1875 $disp [1] 230.7219 $hp [1] 146.6875 ...
Usare lapply()
equivale qui ad applicare un ciclo for:
res <- list() for (i in seq_along(mtcars)) { res[i] <- mean(mtcars[[i]]) } names(res) <- names(mtcars) res
Volendo aggiungere gli argomenti della funzione, scriveremo:
lapply(mtcars, mean, na.rm = T)
sapply
sapply()
è come lapply
, con la differenza che il risultato viene trasformato in un vettore o in una matrice (simplify = TRUE
).
La sintassi della funzione è pertanto:
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
sapply(*, simplify = FALSE, USE.NAMES = FALSE)
equivale lapply(*)
.
Il comando
sapply(mtcars, mean)
restituisce in questo caso il vettore dei risultati:
mpg cyl disp hp drat wt qsec 20.090625 6.187500 230.721875 146.687500 3.596563 3.217250 17.848750 vs am gear carb 0.437500 0.406250 3.687500 2.812500
Ed equivale a:
res <- array() for (i in seq_along(mtcars)) { res[i] <- mean(mtcars[[i]]) } names(res) <- names(mtcars)
Anche in questo caso, gli argomenti delle funzioni seguono il nome della funzione:
sapply(mtcars, mean, na.rm =TRUE)
Qui applichiamo la funzione per standardizzare i valori:
sapply(mtcars, scale)
e otteniamo una matrice:
mpg cyl disp hp drat ... [1,] 0.15088482 -0.1049878 -0.57061982 -0.53509284 0.56751369 ... [2,] 0.15088482 -0.1049878 -0.57061982 -0.53509284 0.56751369 ... [3,] 0.44954345 -1.2248578 -0.99018209 -0.78304046 0.47399959 ... [4,] 0.21725341 -0.1049878 0.22009369 -0.53509284 -0.96611753 ... [5,] -0.23073453 1.0148821 1.04308123 0.41294217 -0.83519779 ... [6,] -0.33028740 -0.1049878 -0.04616698 -0.60801861 -1.56460776 ... ...
Nell'esempio che segue, con la funzione per calcolare i quantili, otteniamo una matrice in cui i nomi di colonna sono i nomi delle variabili e quelli di riga sono i nomi dei risultati:
sapply(mtcars, quantile)
mpg cyl disp hp drat wt qsec vs am gear carb 0% 10.400 4 71.100 52.0 2.760 1.51300 14.5000 0 0 3 1 25% 15.425 4 120.825 96.5 3.080 2.58125 16.8925 0 0 3 2 50% 19.200 6 196.300 123.0 3.695 3.32500 17.7100 0 0 4 2 75% 22.800 8 326.000 180.0 3.920 3.61000 18.9000 1 1 4 4 100% 33.900 8 472.000 335.0 4.930 5.42400 22.9000 1 1 5 8
La funzione restituisce infatti un vettore di elementi con un nome:
quantile(mtcars$mpg)
0% 25% 50% 75% 100% 10.400 15.425 19.200 22.800 33.900