R apply(), lapply(), sapply(), tapply() med eksempler
Denne vejledning har til formål at introducere funktionssamlingen apply(). Apply()-funktionen er den mest grundlæggende af alle samlinger. Vi vil også lære sapply(), lapply() og taply(). Apply-samlingen kan ses som en erstatning for løkken.
Apply()-samlingen er bundtet med r afgørende pakke, hvis du installer R med Anaconda. Anvend i R-funktionen kan fodres med mange funktioner til at udføre redundant applikation på en samling af objekter (dataramme, liste, vektor osv.). Formålet med application() er primært at undgå eksplicit brug af loop-konstruktioner. De kan bruges til en inputliste, matrix eller array og anvende en funktion. Enhver funktion kan overføres til application().
anvende() funktion
ansøge() tager dataramme eller matrix som input og giver output i vektor, liste eller array. ansøge funktion i R bruges primært til at undgå eksplicit brug af loop-konstruktioner. Det er den mest basale af alle samlinger, der kan bruges over en matricer.
Denne funktion tager 3 argumenter:
apply(X, MARGIN, FUN) Here: -x: an array or matrix -MARGIN: take a value or range between 1 and 2 to define where to apply the function: -MARGIN=1`: the manipulation is performed on rows -MARGIN=2`: the manipulation is performed on columns -MARGIN=c(1,2)` the manipulation is performed on rows and columns -FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>
Det enkleste eksempel er at summere en matrice over alle kolonnerne. Koden apply(m1, 2, sum) vil anvende sumfunktionen på matrixen 5×6 og returnere summen af hver kolonne, der er tilgængelig i datasættet.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
Output:

Bedste praksis: Gem værdierne, før du udskriver dem til konsollen.
lapply() funktion
lapply() funktion er nyttig til at udføre operationer på listeobjekter og returnerer et listeobjekt med samme længde som det oprindelige sæt. lappy() returnerer en liste med samme længde som inputlisteobjektet, hvor hvert element er resultatet af at anvende FUN på det tilsvarende element i listen. Anvend i R tager liste, vektor eller dataramme som input og giver output i liste.
lapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
l i lapply() står for liste. Forskellen mellem lapply() og anvende() ligger mellem outputreturn. Outputtet af lapply() er en liste. lapply() kan bruges til andre objekter som datarammer og lister.
lapply()-funktionen behøver ikke MARGIN.
Et meget nemt eksempel kan være at ændre strengværdien af en matrix til små bogstaver med tolower-funktion. Vi konstruerer en matrix med navnet på de berømte film. Navnet er i store bogstaver.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)
Output:
## List of 4 ## $:chr"spyderman" ## $:chr"batman" ## $:chr"vertigo" ## $:chr"chinatown"
Vi kan bruge unlist() til at konvertere listen til en vektor.
movies_lower <-unlist(lapply(movies,tolower)) str(movies_lower)
Output:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
sapply() funktion
ansøge() funktion tager liste, vektor eller dataramme som input og giver output i vektor eller matrix. Det er nyttigt til operationer på listeobjekter og returnerer et listeobjekt med samme længde som det oprindelige sæt. Sapply-funktionen i R udfører det samme job som lapply()-funktionen, men returnerer en vektor.
sapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
Vi kan måle minimumshastigheden og bremselængden for biler fra bilernes datasæt.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
Output:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
Output:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
Output:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
Output:
## speed dist ## 25 120
Vi kan bruge en brugerindbygget funktion i lapply() eller sapply(). Vi opretter en funktion ved navn avg for at beregne gennemsnittet af vektorens minimum og maksimum.
avg <- function(x) {
( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars
Produktion
## speed dist ## 14.5 61.0
Sapply i R er mere effektivt end lapply() i det returnerede output, fordi sapply() gemmer værdier direkte i en vektor. I det næste eksempel vil vi se, at dette ikke altid er tilfældet.
Vi kan opsummere forskellen mellem application(), sapply() og `lapply() i følgende tabel:
| Funktion | argumenter | Objektiv | Input | Produktion |
|---|---|---|---|---|
| ansøge | anvende (x, MARGIN, SJOV) | Anvend en funktion på rækkerne eller kolonnerne eller begge dele | Dataramme eller matrix | vektor, liste, array |
| lapply | lapply(X, SJOV) | Anvend en funktion på alle elementerne i inputtet | Liste, vektor eller dataramme | liste |
| ansøge | sapply (X, SJOV) | Anvend en funktion på alle elementerne i inputtet | Liste, vektor eller dataramme | vektor eller matrix |
Skive vektor
Vi kan bruge lapply() eller sapply() udskiftelige til at opdele en dataramme. Vi opretter en funktion, below_average(), der tager en vektor med numeriske værdier og returnerer en vektor, der kun indeholder de værdier, der er strengt over gennemsnittet. Vi sammenligner begge resultater med identisk()-funktionen.
below_ave <- function(x) {
ave <- mean(x)
return(x[x > ave])
}
dt_s<- sapply(dt, below_ave)
dt_l<- lapply(dt, below_ave)
identical(dt_s, dt_l)
Output:
## [1] TRUE
taply() funktion
tryk () beregner et mål (middelværdi, median, min, max osv..) eller en funktion for hver faktorvariabel i en vektor. Det er en meget nyttig funktion, der lader dig oprette en delmængde af en vektor og derefter anvende nogle funktioner til hver af undermængden.
tapply(X, INDEX, FUN = NULL) Arguments: -X: An object, usually a vector -INDEX: A list containing factor -FUN: Function applied to each element of x
En del af en dataforskers eller -forskers job er at beregne opsummeringer af variabler. Mål for eksempel gennemsnittet eller gruppedata baseret på en karakteristik. De fleste data er grupperet efter ID, by, lande og så videre. Opsummering over gruppe afslører mere interessante mønstre.
For at forstå, hvordan det virker, lad os bruge iris-datasættet. Dette datasæt er meget berømt i verden af maskinlæring. Formålet med dette datasæt er at forudsige klassen for hver af de tre blomsterarter: bægerblad, Versicolor, Virginica. Datasættet indsamler information for hver art om deres længde og bredde.
Som et tidligere arbejde kan vi beregne medianen af længden for hver art. Tryk på R er en hurtig måde at udføre denne beregning på.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
Output:
## setosa versicolor virginica ## 3.4 2.8 3.0
