R apply(), lapply(), sapply(), tapply() med exempel
โก Smart sammanfattning
apply(), lapply(), sapply() och tapply() bildar R-familjen apply, ett vektoriserat alternativ till explicita loopar som tillรคmpar en vald funktion รถver matriser, listor, vektorer och grupperade data fรถr att returnera koncisa resultat.

Denna handledning syftar till att introducera funktionssamlingen application(). Applicera()-funktionen รคr den mest grundlรคggande av alla samlingar. Vi kommer ocksรฅ att lรคra oss sapply(), lapply() och taply(). Appliceringskollektionen kan ses som ett substitut till loopen.
Application()-samlingen รคr buntad med r vรคsentligt paket om du installera R med Anaconda. Applicera i R-funktionen kan matas med mรฅnga funktioner fรถr att utfรถra redundant applikation pรฅ en samling objekt (dataram, lista, vektor, etc.). Syftet med application() รคr frรคmst att undvika explicit anvรคndning av loop-konstruktioner. De kan anvรคndas fรถr en inmatningslista, matris eller array och tillรคmpa en funktion. Vilken funktion som helst kan skickas till application().
applicera() funktion
tillรคmpa() tar dataram eller matris som indata och ger utdata i vektor, lista eller array. Tillรคmpa funktion i R anvรคnds frรคmst fรถr att undvika explicit anvรคndning av loop-konstruktioner. Det รคr den mest grundlรคggande av alla samlingar som kan anvรคndas รถver en matris.
Denna funktion tar 3 argument:
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 enklaste exemplet รคr att summera en matris รถver alla kolumner. Koden applicera(m1, 2, summa) kommer att tillรคmpa summafunktionen pรฅ matrisen 5ร6 och returnera summan av varje kolumn som รคr tillgรคnglig i datamรคngden.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6) m1 a_m1 <- apply(m1, 2, sum) a_m1
Produktion:

Bรคsta praxis: Lagra vรคrdena innan du skriver ut dem pรฅ konsolen.
lapply() funktion
lapply() Funktionen รคr anvรคndbar fรถr att utfรถra operationer pรฅ listobjekt och returnerar ett listobjekt med samma lรคngd som originaluppsรคttningen. lappy() returnerar en lista med samma lรคngd som inmatat listobjekt, vars varje element รคr resultatet av att FUN tillรคmpas pรฅ motsvarande element i listan. Applicera i R tar lista, vektor eller dataram som input och ger utdata i lista.
lapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
l i lapply() stรฅr fรถr list. Skillnaden mellan lapply() och applicera() ligger mellan utdatareturen. Utdata frรฅn lapply() รคr en lista. lapply() kan anvรคndas fรถr andra objekt som dataramar och listor.
lapply()-funktionen behรถver inte MARGIN.
Ett mycket enkelt exempel kan vara att รคndra strรคngvรคrdet fรถr en matris till gemener med tolower-funktion. Vi konstruerar en matris med namnet pรฅ de kรคnda filmerna. Namnet รคr i versaler.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") movies_lower <-lapply(movies, tolower) str(movies_lower)
Produktion:
## List of 4 ## $:chr"spyderman" ## $:chr"batman" ## $:chr"vertigo" ## $:chr"chinatown"
Vi kan anvรคnda unlist() fรถr att konvertera listan till en vektor.
movies_lower <-unlist(lapply(movies,tolower)) str(movies_lower)
Produktion:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
sapply() funktion
applicera() funktion tar list, vektor eller dataram som indata och ger utdata i vektor eller matris. Det รคr anvรคndbart fรถr operationer pรฅ listobjekt och returnerar ett listobjekt med samma lรคngd som originaluppsรคttningen. Sapply-funktionen i R gรถr samma jobb som lapply()-funktionen men returnerar en vektor.
sapply(X, FUN) Arguments: -X: A vector or an object -FUN: Function applied to each element of x
Vi kan mรคta minimihastigheten och stannaping avstรฅnd fรถr bilar frรฅn bildatasetet.
dt <- cars lmn_cars <- lapply(dt, min) smn_cars <- sapply(dt, min) lmn_cars
Produktion:
## $speed ## [1] 4 ## $dist ## [1] 2
smn_cars
Produktion:
## speed dist ## 4 2
lmxcars <- lapply(dt, max) smxcars <- sapply(dt, max) lmxcars
Produktion:
## $speed ## [1] 25 ## $dist ## [1] 120
smxcars
Produktion:
## speed dist ## 25 120
Vi kan anvรคnda en anvรคndarinbyggd funktion i lapply() eller sapply(). Vi skapar en funktion som heter avg fรถr att berรคkna medelvรคrdet av vektorns minimum och maximum.
avg <- function(x) {
( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars
Produktion
## speed dist ## 14.5 61.0
Sapply i R รคr mer effektivt รคn lapply() i utdata som returneras eftersom sapply() lagrar vรคrden direkt i en vektor. I nรคsta exempel kommer vi att se att detta inte alltid รคr fallet.
Vi kan sammanfatta skillnaden mellan application(), sapply() och `lapply() i fรถljande tabell:
| Funktion | Argument | Mรฅl | Ingรฅng | Produktion |
|---|---|---|---|---|
| tillรคmpa | tillรคmpa(x, MARGIN, ROLIGT) | Tillรคmpa en funktion pรฅ raderna eller kolumnerna eller bรฅda | Dataram eller matris | vektor, lista, array |
| lapply | lapply(X, ROLIGT) | Tillรคmpa en funktion pรฅ alla element i inmatningen | Lista, vektor eller dataram | lista |
| applicera | sapply(X, ROLIGT) | Tillรคmpa en funktion pรฅ alla element i inmatningen | Lista, vektor eller dataram | vektor eller matris |
Skiva vektor
Vi kan anvรคnda lapply() eller sapply() utbytbara fรถr att dela en dataram. Vi skapar en funktion, below_average(), som tar en vektor med numeriska vรคrden och returnerar en vektor som bara innehรฅller de vรคrden som รคr strikt รถver genomsnittet. Vi jรคmfรถr bรฅda resultaten med identical()-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)
Produktion:
## [1] TRUE
tapply() funktion
knacka () berรคknar ett mรฅtt (medelvรคrde, median, min, max, etc..) eller en funktion fรถr varje faktorvariabel i en vektor. Det รคr en mycket anvรคndbar funktion som lรฅter dig skapa en delmรคngd av en vektor och sedan tillรคmpa nรฅgra funktioner pรฅ var och en av delmรค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 av uppgiften fรถr en datavetare eller forskare รคr att berรคkna sammanfattningar av variabler. Mรคt till exempel genomsnittet eller gruppdata baserat pรฅ en egenskap. De flesta uppgifterna รคr grupperade efter ID, stad, lรคnder och sรฅ vidare. Att sammanfatta รถver gruppen avslรถjar mer intressanta mรถnster.
Fรถr att fรถrstรฅ hur det fungerar, lรฅt oss anvรคnda irisdatasetet. Denna datauppsรคttning รคr mycket kรคnd i vรคrlden av maskininlรคrning. Syftet med denna datauppsรคttning รคr att fรถrutsรคga klassen fรถr var och en av de tre blomarterna: sepal, Versicolor, Virginica. Datauppsรคttningen samlar in information fรถr varje art om deras lรคngd och bredd.
Som ett tidigare arbete kan vi berรคkna medianen fรถr lรคngden fรถr varje art. Tryck pรฅ R รคr ett snabbt sรคtt att utfรถra denna berรคkning.
data(iris) tapply(iris$Sepal.Width, iris$Species, median)
Produktion:
## setosa versicolor virginica ## 3.4 2.8 3.0
