R apply(), lapply(), sapply(), tapply() med exempel

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 stoppsträckan för bilar från bilens datauppsättning.

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