R apply(), lapply(), sapply(), tapply() med eksempler
Denne opplæringen tar sikte på å introdusere funksjonssamlingen apply(). Apply()-funksjonen er den mest grunnleggende av all samling. Vi vil også lære sapply(), lapply() og taply(). Applikasjonssamlingen kan sees på som en erstatning for loopen.
Apply()-samlingen er buntet med r avgjørende pakke hvis du installer R med Anaconda. Apply in R-funksjonen kan feeds med mange funksjoner for å utføre redundant applikasjon på en samling av objekter (dataramme, liste, vektor, etc.). Hensikten med application() er først og fremst å unngå eksplisitt bruk av loop-konstruksjoner. De kan brukes for en inndataliste, matrise eller matrise og bruke en funksjon. Enhver funksjon kan overføres til application().
anvende() funksjon
søke om() tar dataramme eller matrise som input og gir utdata i vektor, liste eller array. Søke funksjon i R brukes først og fremst for å unngå eksplisitt bruk av loop-konstruksjoner. Det er den mest grunnleggende av alle samlinger som kan brukes over en matris.
Denne funksjonen tar 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 eksemplet er å summere en matrise over alle kolonnene. Koden gjelder(m1, 2, sum) vil bruke sumfunksjonen på matrisen 5×6 og returnere summen av hver kolonne som er tilgjengelig i datasettet.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
Utgang:

Beste praksis: Lagre verdiene før du skriver dem ut til konsollen.
lapply() funksjon
lapply() funksjonen er nyttig for å utføre operasjoner på listeobjekter og returnerer et listeobjekt med samme lengde som originalsettet. lappy() returnerer en liste med samme lengde som inndatalisteobjekt, hvor hvert element er resultatet av å bruke FUN på det tilsvarende elementet i listen. Bruk i R tar liste, vektor eller dataramme som input og gir utdata 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. Forskjellen mellom lapply() og apply() ligger mellom utdataretur. Utdataene til lapply() er en liste. lapply() kan brukes for andre objekter som datarammer og lister.
lapply()-funksjonen trenger ikke MARGIN.
Et veldig enkelt eksempel kan være å endre strengverdien til en matrise til små bokstaver med tolower-funksjon. Vi konstruerer en matrise med navnet på de kjente filmene. Navnet er i store bokstaver.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") movies_lower <-lapply(movies, tolower) str(movies_lower)
Utgang:
## List of 4 ## $:chr"spyderman" ## $:chr"batman" ## $:chr"vertigo" ## $:chr"chinatown"
Vi kan bruke unlist() for å konvertere listen til en vektor.
movies_lower <-unlist(lapply(movies,tolower)) str(movies_lower)
Utgang:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
sapply() funksjon
søke() funksjon tar liste, vektor eller dataramme som input og gir utdata i vektor eller matrise. Det er nyttig for operasjoner på listeobjekter og returnerer et listeobjekt med samme lengde som originalsettet. Sapply-funksjonen i R gjør den samme jobben som lapply()-funksjonen, 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 minimumshastighet og stoppdistanse for biler fra bilens datasett.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
Utgang:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
Utgang:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
Utgang:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
Utgang:
## speed dist ## 25 120
Vi kan bruke en bruker innebygd funksjon i lapply() eller sapply(). Vi lager en funksjon kalt avg for å beregne gjennomsnittet av minimum og maksimum av vektoren.
avg <- function(x) { ( min(x) + max(x) ) / 2} fcars <- sapply(dt, avg) fcars
Produksjon
## speed dist ## 14.5 61.0
Sapply i R er mer effektivt enn lapply() i utdataene som returneres fordi sapply() lagrer verdier direkte i en vektor. I det neste eksemplet vil vi se at dette ikke alltid er tilfelle.
Vi kan oppsummere forskjellen mellom application(), sapply() og `lapply() i følgende tabell:
Funksjon | argumenter | Målet | Input | Produksjon |
---|---|---|---|---|
søke om | bruk(x, MARGIN, MORO) | Bruk en funksjon på radene eller kolonnene eller begge deler | Dataramme eller matrise | vektor, liste, array |
lapply | lapply(X, MORO) | Bruk en funksjon på alle elementene i inngangen | Liste, vektor eller dataramme | liste |
påføre | sapply (X, FUN) | Bruk en funksjon på alle elementene i inngangen | Liste, vektor eller dataramme | vektor eller matrise |
Skivevektor
Vi kan bruke lapply() eller sapply() utskiftbare for å dele en dataramme. Vi lager en funksjon, below_average(), som tar en vektor med numeriske verdier og returnerer en vektor som bare inneholder verdiene som er strengt tatt over gjennomsnittet. Vi sammenligner begge resultatene med funksjonen identisk().
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)
Utgang:
## [1] TRUE
taply() funksjon
trykk() beregner et mål (middelverdi, median, min, maks osv..) eller en funksjon for hver faktorvariabel i en vektor. Det er en veldig nyttig funksjon som lar deg lage en delmengde av en vektor og deretter bruke noen funksjoner på hver delmengde.
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 av jobben til en dataforsker eller forskere er å beregne sammendrag av variabler. Mål for eksempel gjennomsnittet eller gruppedataene basert på en egenskap. De fleste dataene er gruppert etter ID, by, land og så videre. Oppsummering over gruppe avslører mer interessante mønstre.
For å forstå hvordan det fungerer, la oss bruke iris-datasettet. Dette datasettet er veldig kjent i verden av maskinlæring. Hensikten med dette datasettet er å forutsi klassen til hver av de tre blomsterartene: Begerblad, Versicolor, Virginica. Datasettet samler informasjon for hver art om deres lengde og bredde.
Som et tidligere arbeid kan vi beregne medianen av lengden for hver art. Trykk på R er en rask måte å utføre denne beregningen på.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
Utgang:
## setosa versicolor virginica ## 3.4 2.8 3.0