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.

  • ๐Ÿ”ฒ tillรคmpas(): Kรถr en funktion รถver matrisrader eller kolumner.
  • ๐Ÿ“‹ lapply(): Tillรคmpar en funktion pรฅ varje listelement, returnerar en lista.
  • ๐Ÿ“Š sapply(): Som lapply() men fรถrenklar utdata till en vektor.
  • ๐Ÿ—‚๏ธ tapply(): Tillรคmpar en funktion pรฅ grupper definierade av en faktor.
  • ๐Ÿค– AI-hjรคlp: AI fรถreslรฅr vektoriserad tillรคmpning av kod รถver lรฅngsamma loopar.

applicera, lapply, sapply och tapply i R

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:

Apply() funktionsexempel i R
application() funktionsexempel i R

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

Vanliga frรฅgor

Apply-funktioner รคr inte alltid snabbare รคn for loopar; deras frรคmsta fรถrdel รคr koncis, lรคsbar kod. Vektoriserade operationer pรฅ hela vektorer รคr vanligtvis snabbare รคn bรฅda.

vapply() fungerar som sapply() men anvรคnder en returtyp fรถr sรคkerhets skull, medan mapply() รคr en multivariat version som tillรคmpar en funktion pรฅ flera vektorer samtidigt.

Bรฅda tillรคmpar en funktion pรฅ varje element i en lista eller vektor. lapply() returnerar alltid en lista, medan sapply() fรถrenklar resultatet till en vektor nรคr det รคr mรถjligt.

Ja. AI-assistenter kan konvertera loopar till apply- eller sapply-anrop, fรถreslรฅ rรคtt funktion fรถr dina data och fรถrklara argument som MARGIN och FUN.

AI-verktyg genererar R-kod, rekommenderar vektoriserade tillรคmpningsfunktioner, upptรคcker fel och sammanfattar resultat, hjรคlpping analytiker bearbetar dataramar snabbare med fรคrre buggar.

Sammanfatta detta inlรคgg med: